1

MISE À JOUR

Je pense qu'il était prématuré de demander cela. Après quelques tests supplémentaires, j'ai découvert que la performance ne s'est pas améliorée. Je vais exécuter quelques tests supplémentaires et publier des mises à jour ici. Jusque-là, ne prenez pas la peine de répondre à cela.SQL Query UNION Performance

J'ai eu une question comme ça ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo 
         UNION 
         SELECT boTemp.[Id] 
         FROM [#BusinessObject_Table] boTemp) 

Cette requête prend une éternité pour exécuter un ensemble de données non négligeable. J'ai également ajouté l'index de CLUSTERED sur la colonne d'identification des tables de Temp, qui a donné un certain gain de performance, mais toujours, n'a pas réussi à compléter.

Je remplacé cette requête avec ce ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo) 
     AND [Field_A] NOT IN (SELECT boTemp.[Id] 
          FROM [#BusinessObject_Table] boTemp) 

Ce terminé en quelques secondes. Quelqu'un peut-il expliquer ce qui s'est passé ici?

MISES À JOUR: Je pensais que les deux requêtes sont les mêmes. C'est ce dont j'ai besoin.

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

Le résultat de la requête doit être: 6 (changement de note dans la requête ci-dessus)

je vais essayer d'obtenir les plans de requête et après les ici.

+1

Veuillez poster les plans. Les requêtes font des choses différentes de toute façon. Le second vérifie qu'il n'apparaît pas dans les deux tables. La première ou l'autre table. Le premier aurait besoin d'utiliser 'intersect' ou le' '' '' '' 'soit identique. –

Répondre

3

Deviner l'en l'absence de plans de requête ...

L'UNION dans la sous-requête force un DISTINCT. Avec des clauses IN distinctes, ceci est évité. Cependant, la logique est différente entre les requêtes (Edit: comme Martin Smith a noté)

Avec UNION ALL et une seule en elle devrait être mieux si cela est la logique que vous voulez

WHERE [Field_A] NOT IN (SELECT bo.[Id] 
        FROM [BusinessObject_Table] bo 
        UNION ALL 
        SELECT boTemp.[Id] 
        FROM [#BusinessObject_Table] boTemp) 
2

Je pense que vous devriez faire votre requête de cette façon:

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE NOT EXISTS(
    SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) AND NOT EXISTS(
    SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) 

De cette façon, SQL Server peut utiliser son optimiseur probablement un peu mieux que votre requête UNIONed. Il se peut très bien que l'optimiseur choisisse d'exécuter votre requête dans un ordre différent, en fonction de vos stratégies d'indexation et de la taille de vos tables. Très probablement, ce sera le moyen le plus rapide de le faire. Cependant, sans structure de table ni index ni plans d'exécution, il est difficile d'en être certain.

+0

Merci pour ça. La requête est rapide maintenant. Je vais tester cela, et poster plus de commentaires ici plus tard (avec les plans d'exécution) – Zuber