2016-08-08 3 views
1

Ich habe eine einfache SQL-Abfrage, die einen INNEREN JOIN zwischen Tabellen A und B mit Filterung macht. Tabelle A ist sehr groß, wohingegen Tabelle B ziemlich klein ist. Ich möchte nur Zeilen zurückgeben, die einem bestimmten Filter entsprechen, z. B. table_B.some_col IN ('a', 'b', 'c', 'd'). Natürlich habe ich diesen Filter als WHERE-Klausel. Allerdings wurde mir empfohlen, denselben Filter zu duplizieren, aber für Tabelle A und in den Join einzufügen. Zum BeispielSQL - innere Verbindung zwischen großer Tabelle und kleiner Tabelle, mit Filtern

SELECT 
* 
FROM table_A 
INNER JOIN table_B 
    ON table_A.pk = table_B.pk 
    AND table_A.some_col IN ('a', 'b', 'c', 'd') 
WHERE 
table_B.some_col IN ('a', 'b', 'c', 'd') 

Es wird behauptet, dass dies den Abfrageplan verbessert. Leider kann ich aufgrund von Sicherheitsbeschränkungen auf meinem Computer Abfragepläne nicht überprüfen. Ist diese Behauptung wahr?

+0

festhalten , Ihre zwei Abfragen sind tatsächlich verschiedene Abfragen, ohne die Tabelle_A.some_col IN ... würden Sie eine beliebige aus B mit übereinstimmenden Primärschlüssel in A ausgewählt - es sei denn, some_col in B ist doppelte Wert in A – Cato

Antwort

0

einen Filter bei And oder Where Klausel macht keinen Unterschied Hinzufügen ..

Hier sind einige Tests ..

Abfrage verwendet ..
select * from Aufträge o beitreten hr.mitarbeiter h auf h.empid = o.empid

Filter an und Satz ..
und empid = 4

Ausführungsplan:
enter image description here

Set Statistiken IO:

Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Filter Wo Klausel:
wo empid = 4

Ausführungsplan:
enter image description here

Statistik IO:

Table 'orders'. Scan count 1, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Employees'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

In jedem Fall SQLServer intelligent genug ist Abfrage neu zu ordnen (da es inner join) und erhalten nur relevante Zeilen

Verwandte Themen