[SQL Server] Procédure stockée trop longue

Procédure stockée trop longue [SQL Server] - SQL/NoSQL - Programmation

Marsh Posté le 06-09-2005 à 11:43:56    

Bonjour,
 
J'ai une procédure stockée qui comporte un grand nombre de requêtes SQL. La grande majorité de celles-ci se déroule très rapidement (qq ms), mais 2 d'entre elles sont très longues (500s pour une, >1000s pour l'autre) sans que je comprenne vraiment pourquoi (elles sont en tout point similaire aux autres)
 
J'ai activé la trace sur l'analyseur de requêtes et sur le générateur de profil. Le premier m'indique ~200ms pour les deux requêtes en question alors que le second indique env. 500 000 ou 1 000 000 ms.
 
Quelqu'un saurait-il à quoi cette différence est dûe ?
Quelqu'un aurait-il une explication quand à la longueur de ces deux requêtes particulières ?
 
Voici les requêtes en question :
 

Code :
  1. DELETE FROM Table1 WHERE Table1_ID IN (SELECT T_ID FROM @T)
  2. DELETE FROM Table2 WHERE Colonne2 = @valeur


 
Je précise que
Table1_ID est la clé primaire de la Table1
@T est une variable table
Colonne2 est une clé étrangère de la Table2
 
Si vous avez besoin de plus d'informations, n'hésitez pas !
 
 
Merci d'avance

Reply

Marsh Posté le 06-09-2005 à 11:43:56   

Reply

Marsh Posté le 06-09-2005 à 16:34:55    

déjà, vire ton IN et remplace le par un EXISTS avec une jointure dans la sous-requête, ce sera bien plus rapide

Reply

Marsh Posté le 06-09-2005 à 20:38:01    

Donne nous le nombre de lignes dans chaque table, pour commencer ...
 
Quant au IN / EXISTS, ça dépend du SGBD, Oracle par exemple s'en fout un peu, il choisit le meilleur plan d'exécution, que l'on mette IN ou EXISTS ... peut-être que ça a une importance pour SQL Server, je sais pas.

Reply

Marsh Posté le 07-09-2005 à 09:25:34    

et au niveau du plan d'exécution?
les données dans le where sont exactement du même type?

Reply

Marsh Posté le 07-09-2005 à 09:35:07    

Je parie qu'avec des index bien placés, ça irait plus vite. :o

Reply

Marsh Posté le 07-09-2005 à 17:29:37    

Beegee a écrit :

Donne nous le nombre de lignes dans chaque table, pour commencer ...
 
Quant au IN / EXISTS, ça dépend du SGBD, Oracle par exemple s'en fout un peu, il choisit le meilleur plan d'exécution, que l'on mette IN ou EXISTS ... peut-être que ça a une importance pour SQL Server, je sais pas.


A la seule différence près qu'un IN, de mémoire, ne peux pas dépasser 8000 éléments sous Oracle (du moins, jusqu'à la version 9i incluse) même si c'est une sous-requête, alors que le EXISTS n'a pas de limite en nombre d'éléments.
 
C'est à cause de cette limitation que j'ai découvert le mot clé EXISTS, dont sur le coup, je suis sûr de moi ;)

Reply

Marsh Posté le 07-09-2005 à 17:30:53    

Quand à la diff de performances, peut-être que ça vient d'une réécriture du moteur dans les versions > 9i ou alors d'un paramètrage spécifique, mais moi, sous Oracle autant qu'avec n'importe quel SGBD, j'ai toujours divisé au moins par 5 les temps d'éxécution avec des EXISTS par rapport à IN

Reply

Marsh Posté le 07-09-2005 à 20:27:27    

Sous Oracle, y a en effet pas mal de paramètre qui vont faire qu'à partir de versions récentes, et suivant le mode de l'optimiseur (cost based ou RULE), écrire IN ou EXISTS aura peu d'importance.
 
La limitation à 8000 élément dans une sous-requête IN, j'y crois pas trop avec la 9i ... faudrait tester :)
 
Le IN est le EXISTS ne sont pas strictement équivalents d'ailleurs, que ce soit niveau interprétation par l'optimiseur, mais aussi niveau résultat, la gestion des NULL n'est pas la même.
 
edit: plus d'infos ici :
 
http://asktom.oracle.com/pls/ask/f [...] 3229842074


Message édité par Beegee le 07-09-2005 à 23:25:08
Reply

Marsh Posté le 07-09-2005 à 23:55:36    

Avec ce genre de query, il peut y avoir un rollback segment qui se remplit plus qu'à l'habitude, et si le tablespace est sous-dimensionné (ce que j'ai vu plusieurs fois), alors cela peut causer des ralentissements, ou même des erreurs d'exécution. Il faudrait qu'un DBA vous assiste pour régler ce problème de performance.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed