Examinons ces deux déclarations:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Si CONDITION 1
est TRUE
, sera CONDITION 2
vérifié?
Si CONDITION 3
est FALSE
, sera CONDITION 4
vérifié?
Qu'en est-il des conditions sur WHERE
: le moteur SQL Server optimise-t-il toutes les conditions d'une WHERE
clause? Les programmeurs doivent-ils placer les conditions dans le bon ordre pour s'assurer que l'optimiseur SQL Server les résout correctement ?
AJOUTÉE:
Merci à Jack pour le lien, surprise de t-sql code:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
Il n'y a pas d' exception de division par zéro dans ce cas.
CONCLUSION:
Si C ++ / C # / VB est court-circuité, pourquoi SQL Server ne l’a-t-il pas?
Pour répondre réellement à cette question, examinons comment les deux fonctionnent avec des conditions. C ++ / C # / VB ont tous un court-circuit défini dans les spécifications du langage pour accélérer l'exécution du code. Pourquoi s'embêter à évaluer les conditions N OR lorsque la première est déjà vraie ou les conditions M AND lorsque la première est déjà fausse.
En tant que développeurs, nous devons savoir que SQL Server fonctionne différemment. C'est un système basé sur les coûts. Pour obtenir le plan d’exécution optimal pour notre requête, le processeur de requête doit évaluer chaque condition sur chaque et lui attribuer un coût. Ces coûts sont ensuite évalués dans leur ensemble pour former un seuil qui doit être inférieur au seuil défini par SQL Server pour un bon plan. Si le coût est inférieur au seuil défini, le plan est utilisé, sinon le processus complet est répété avec une combinaison différente de coûts de condition. Le coût ici est soit une analyse, soit une jointure de fusion ou de fusion, ou une jointure de hachage, etc. Pour cette raison, le court-circuitage tel qu’il est disponible en C ++ / C # / VB n’est tout simplement pas possible. Vous pourriez penser que forcer l'utilisation de l'index sur une colonne est considéré comme un court-circuit, mais ce n'est pas le cas. Cela force seulement l'utilisation de cet index et avec cela raccourcit la liste des plans d'exécution possibles. Le système est toujours basé sur les coûts.
En tant que développeur, vous devez savoir que SQL Server ne court-circuite pas comme dans les autres langages de programmation et vous ne pouvez rien y faire.