2017-10-09 12 views
-2

J'ai une procédure stockée dans ma base de données. Lorsque j'appelle cette procédure stockée, parfois cela prend 1 minute, parfois cela prend 10 minutes, et d'autres fois cela prend encore plus que cela pour terminer.La procédure stockée prend beaucoup de temps

L'étape ci-dessous seulement de prendre plus de temps dans le processus, pas sûr si cette pauvre requête et le besoin de réécrire la procédure stockée ou d'un autre problème de serveur

IF (EXISTS (SELECT 1 
      FROM table1 PWI (NOLOCK) 
      INNER JOIN table2 W (NOLOCK) ON PWI.ID = W.ID 
      WHERE W.Flag = 1 
       AND PWI.PatID IN (SELECT PatID FROM @table3) 
       AND W.SubID IN (SELECT SubID FROM @table4))) 

S'il vous plaît aider à résoudre ce problème

+4

plan d'exécution? –

+2

Pour commencer, vous devriez vous débarrasser de ces indices NOLOCK. Ils ne sont pas une bonne idée 99,999% du temps. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+3

La définition de table (y compris les index), le plan d'exécution, le nombre approximatif de lignes seraient très utiles ici. –

Répondre

-2

variable de tableau obtient l'estimation row = 1 et la construction de plan avec la jointure de boucle. table utilisation temporaire ou OPTION (RECOMPILE)

+1

C'est plus un commentaire qu'une réponse. Et ce n'est pas clair ce que vous essayez de dire ici. –

+0

Lors de la modification de la variable de table en #temp table résolu mon problème. maintenant le SP fonctionne seulement 19 secondes où il a fallu 13 minutes auparavant. merci – vinoth

+0

Ne pas utiliser la variable de table sans trop besoin :) –

0

Hart à dire sans tout le code et DDL, mais cela peut améliorer les performances

IF (EXISTS (SELECT 1 
FROM table1 PWI (NOLOCK) 
INNER JOIN table2 W (NOLOCK) ON PWI.ID = W.ID 
inner join @table3 on PWI.PatID = @table3.PatID 
inner join @table4 on W.SubID = @table4.SubID 
WHERE W.Flag = 1))