Bonjour,
Je travaille en VB6 et avec SQL-SERVER 8
J'ai fait une stored procedure qui exécute une série de requête, pour aboutir avec une table temporaire ##, table qui sera lue par mon programme VB6.
Mais voilà, la stored procedure est très longue à exécuter, elle prend entre 20 et 30 secondes. C'est beaucoup trop long.
(Petite parenthèse, je suis déçu, je croyais que l'exécution côté serveur était plus rapide, mais c'était plus rapide quand je faisais une longue et exténuante série de if then else en VB6 enfin....)
Bref, afin de m'aider à optimiser ma stored, j'ai copié le contenu de ma stored dans le Query Analyser et je fais afficher le "estimated execution plan" qui me permet de rapidement repérer la ou les requêtes plus lente.
J'ai trouvé la requête. Il s'agit d'un petit insert de rien du tout.
Je commence par vous montrer la requête
La table #TableDate ne contient que 52 enregistrements, un pour chaque semaine, et n'a que deux champs, soit c1year et c1sem. J'ai mis un index clustered sur les deux champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 insert into #pcRabais3 select ddmarq, ddform, ddgrou, dtype, btbann, c1sem, valBPCS from #pcRabais1 join #TableDate b on (b.c1sem between semdebut and semfin)
La table #pcRabais1 contient en revanche environ 25'000 enregistrements (varie dépendant des clients). J'ai mis un index sur tout ses champs texte :
Le insert prend 63% du temps d'exécution total de la stored, donc environ 15 seconde. Dans le estimated execution plan, j'ai vu à quel endroit la requête prend le plus de temps. Il s'agit d'un sort. Il prend à lui seul 74% du temps d'exécution de la requête. Lorque je regarde les arguments de cette étape, c'est écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE INDEX [IndexPhysique] ON [dbo].[#pcRabais1]([ddmarq], [ddform], [ddgrou], [dtype], [btbann]) ON [PRIMARY]
Ma question finalement... POURQUOI est-ce que l'insert est aussi long et POURQUOI est-ce que la requête génère un SORT alors que je n'ai aucun order by...ORDER BY: ([#pcRabais1].[ddmarq] ASC, [#pcRabais1].[ddform] ASC, [#pxRabais1].[ddgrou] ASC, [#pcRabais1].[dtype] ASC, [#pcRabais#].[btbann] ASC, [#tabledate].[c1sem] ASC)
Je vous remercie pour le temps que vous prendrez à me répondre.![]()
Partager