Bonjour
J'aimerais optimiser une requete/procedure stockee.
Voici un peu le contexte:
Ma procedure stockee cree une requete dynamiquement car elle recoit des parametres pour creer la clause where
A la fin je l'execute avec
Ma procedure stockee est utilisee pour alimenter un datasource (qui alimente un GridView)
Code : Sélectionner tout - Visualiser dans une fenêtre à part EXEC sp_executesql @SQLQuery
D'apres mes recherches, sous ASP.NET, pour ne pas faire un select entier pour le GridView lorsqu'on veut afficher que 10 records par page, il faut utiliser la methode du Custom Paging qui consiste a utiliser la procedure ROW_NUMBER() que j'utilise donc.
Cette technique marche tres bien, je l'ai essaye sur une table de 30 000 entrees et ca va tres vite.
Le probleme c'est que quand j'utilise la meme technique sur ma Vue de 1900 entrees, c'est plus long...
Voici les donnees du Profiler:
-procedure en rapport avec la table d'environ 30 000 entrees:
CPU: 47
reads: 1258
duration: 40
-procedure en rapport avec la Vue d'environ 1900 entrees:
CPU: 590
reads: 48055
duration: 589
Donc je pense que je peux ameliorer ma requete en rapport avec ma Vue...
- soit reecrire ma Vue car j'ai beaucoup de sous requetes
- soit utiliser directement la table et non la vue et faire des sous requetes ensuite une fois que j'ai ramene que mes 10 records grace au Row Number ?
Voici la structure de ma vue:
Voici la requete dans ma procedure stockee qui est executee:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT ID, Champ1ID, (SELECT dbo.FormatterTexte(LTRIM(RTRIM(FirstName)) + ' ' + LTRIM(RTRIM(LastName))) AS Name FROM dbo.Table2 WHERE (ID = dbo.Table1.Champ1ID)) AS Champ1Name ....... + 10 autres Select comme ca (parfois la meme table) ....... + une vingtaine de champs de la table FROM dbo.Table1 ORDER BY Date DESC
Qu'en pensez-vous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 SELECT [ID] ,[Champ1ID] ,[Champ1Name] ,[Champ2Code] ,[Champ2Name] ,[Champ3ID] ,[Champ3Name] ... ,[ModifiedDate] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY CreatedDate DESC) AS RowNum ,[Champ1ID] ,[Champ1Name] ,[Champ2Code] ,[Champ2Name] ,[Champ3ID] ,[Champ3Name] ... ,[ModifiedDate] FROM .[dbo].[viewTable1] WHERE ... ) as viewTable1Derived WHERE RowNum > 1870 AND RowNum <= (1870 + 10)
Je ne sais pas si c'est tres clair... ?
Merci
A+
Partager