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?
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.