J'ai la requête ci-dessous:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
La requête ci-dessus se termine en trois secondes.
Si la requête ci-dessus renvoie une valeur, nous voulons que la procédure stockée EXIT, donc je l'ai réécrite comme ci-dessous:
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
Cependant, cela prend 10 minutes.
Je peux réécrire la requête ci-dessus comme ci-dessous, qui se termine également en moins de 3 secondes:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
Le problème avec la réécriture ci-dessus est que la requête ci-dessus fait partie d'une plus grande procédure stockée et renvoie plusieurs jeux de résultats. En C #, nous parcourons chaque jeu de résultats et effectuons un traitement.
Ce qui précède renvoie un jeu de résultats vide, donc si je choisis cette approche, je dois changer mon C # et refaire le déploiement.
Donc ma question est,
pourquoi l'utilisation
IF EXISTS
change- t-elle simplement le plan pour prendre autant de temps?
Voici les détails qui peuvent vous aider et faites-moi savoir si vous avez besoin de détails:
- Créer un tableau et un script de statistiques pour obtenir le même plan que le mien
- Plan d'exécution lente
Plan d'exécution rapide
Plan lent avec Brentozar Coller le plan
Plan rapide avec Brentozar Coller le plan
Remarque: Les deux requêtes sont les mêmes (en utilisant des paramètres), la seule différence est EXISTS
(j'ai peut-être fait quelques erreurs lors de l'anonymat).
Les scripts de création de table sont ci-dessous:
http://pastebin.com/CgSHeqXc - statistiques de petite table
http://pastebin.com/GUu9KfpS - statistiques de grande table