web-dev-qa-db-fra.com

SI EXISTE dans T-SQL

Si nous avons une instruction SELECT à l'intérieur d'un IF EXISTS, l'exécution s'arrête-t-elle dès qu'elle trouve un enregistrement dans la table? Par exemple:

IF EXISTS(SELECT *  FROM  table1  WHERE Name='John' )

return 1

else

return 0

S'il existe une ligne dans la table portant le nom = John, arrête-t-elle l'exécution et renvoie-t-elle 1 ou parcourt-elle la totalité de la table à la recherche de correspondances supplémentaires?

44
Sidd

Oui, il arrête l'exécution, ce qui est généralement préférable à HAVING COUNT(*) > 0 qui, souvent, ne le fera pas.

Si vous regardez le plan d’exécution avec EXISTS, vous verrez que le nombre réel de lignes sortant de table1 ne sera pas supérieur à 1, quel que soit le nombre d'enregistrements correspondants.

Dans certaines circonstances, SQL Server peut convertir l’arborescence de la requête COUNT en une requête identique à celle de EXISTS pendant la phase de simplification (avec une semi-jointure et aucun opérateur d’agrégat en vue) un exemple de cela est discuté dans les commentaires ici .

Pour des sous-arbres plus compliqués que ceux indiqués dans la question, vous trouverez parfois que COUNT donne de meilleurs résultats que EXISTS. Comme la semi-jointure n'a besoin que d'extraire une ligne de l'arborescence, cela peut encourager un plan avec des boucles imbriquées pour cette partie de l'arborescence - ce qui peut ne pas fonctionner de manière optimale dans la pratique.

49
Martin Smith