Supposons que j'ai le code suivant:est IN (SELECT ...) mauvais pour la performance?
SELECT *
FROM [myTable]
WHERE [myColumn] IN (SELECT [otherColumn] FROM [myOtherTable])
Est-ce que la sous-requête d'exécuter à nouveau et à nouveau pour chaque ligne?
Si oui, puis-je l'exécuter et stocker ses résultats et les utiliser pour chaque ligne à la place? Par exemple:
SELECT [otherColumn]
INTO #Results
FROM [myOtherTable]
SELECT *
FROM [myTable]
WHERE [myColumn] IN (#Results)
L'optimiseur doit mettre en cache ou créer une table temporaire afin qu'il n'exécute pas la sous-requête à plusieurs reprises. C'est relativement bon à ça. Vous devez également vérifier 'EXISTS' –
Non ce n'est pas mauvais pour la performance, SQL Server peut choisir jointure hash ou fusionner jointure (qui évalue la sous-requête une fois) ou boucles imbriquées qui exécuteront différentes parties de la sous-requête pour chaque ligne externe. –
Vous n'obtiendrez pas de performances optimales jusqu'à ce que vous 1) index 2) ajouter à la clause where. –