2017-01-09 3 views
2

Ich versuche, eine verschachtelte Schleife, um Join ohne Force-Option zu verschmelzen, ich habe Tabelle Daten und Abfrage unten danke gegeben.Wie wird eine folgende SQL-Abfrage optimiert?

Tabelle 1:

N_ID S_NAME DEPT 
    1 NAME1 DEPT1 
    2 NAME2 DEPT2 
    3 NAME3 DEPT3 

Tabelle 2:

N_ID S_CITY PHONE 
    1 CITY1 PHONE1 
    2 CITY2 PHONE2 
    3 CITY3 PHONE3 

ich erstellt Index habe wie unten:

CREATE NONCLUSTERED INDEX IX_NC ON TBL1(N_ID) 
INCLUDE (S_NAME) 

CREATE NONCLUSTERED INDEX IX_NC ON TBL2(N_ID) 

Abfrage:

SELECT A.N_ID,S_NAME FROM TBL1 A 
INNER JOIN TBL2 B ON A.N_ID=B.N_ID; 

Hier ist mein Ausführungsplan:

enter image description here

+2

Warum wollen Sie Nested Loop mit Merge Join ersetzen? Lassen Sie SQL Server entscheiden, welche Join-Operation für Ihre Daten am besten geeignet ist. –

+0

Wenn ich viele Daten in tb2 oder tb1. Habe, dann hängt die geschätzte Anzahl der Ausführungen davon ab, wie viele Daten tb1 oder tb2 haben. –

+0

Stellen Sie sicher, dass die Indizes nicht fragmentiert sind, die Statistiken aktuell sind und Abfragen ordnungsgemäß ausgeführt werden sollten. –

Antwort

2

Wenn Sie Gründe zwingen Merge haben Nested Loops Join über, würde ich nicht empfehlen, das zu tun ..

SQLServer intern implementiert verbindet als drei Betreiber

1.Nested Schlaufen
2.Hash
3.Merge

Eac h hat seine eigenen Vorteile und es ist nicht möglich zu sagen, ein Join ist besser als andere .. SQL kann wählen Sie eine Verbindung basierend auf vielen Faktoren und insgesamt wählt es einen Plan mit weniger Kosten ...

Kommen zu Ihrer Frage , Wie pro Docs ..

Nested Loops wird gewählt, wenn ..

Wenn man beitreten Eingang klein (weniger als 10 Zeilen) und der andere Eingang verbinden ist recht groß und indexiert auf seinen Säulen verbinden, Ein Join für den Nested-Loops-Index ist der schnellste Join-Vorgang, da er den geringsten E/A-Aufwand und die wenigsten Vergleiche erfordert

Erklärt auch Fälle, in denen MSDN verschachtelte Schleifenverbindung wirksam ist ..

eine verschachtelte Schleife verbinden ist besonders wirksam, wenn die äußeree Eingang klein ist und der innere Eingang preindexed und groß. In vielen kleinen Transaktionen, z. B. solchen, die nur eine kleine Anzahl von Zeilen betreffen, sind Joins mit dem Nested-Loop-Index den Merge-Joins und Hash-Joins überlegen.

Also, wenn Sie einen Hinweis und Ingenieur Daten in einer solchen Art und Weise erzwingen, wählt SQL fusionieren join..Merge beitreten in Ihrem Fall nicht möglich ist

Referenzen:
https://msdn.microsoft.com/en-us/library/ms191426(v=sql.100).aspx

+0

Sie müssen nicht zwangsläufig einen Hinweis Join erzwingen. Da der Typ des verwendeten Operators vom Cardinality Estimator bestimmt wird, kann das erneute Schreiben der Abfrage in einer Weise, die eine höhere Zeilenanzahl "fälscht", dazu führen, dass der Optimierer einen geeigneteren Operator verwendet. [Sehen Sie sich Adam Machanics Zeilenziele an] (https://www.youtube.com/watch?v=O8BGYC8_qEI). –

Verwandte Themen