2017-11-29 2 views
1

ich eine Abfrage wie diese:Warum ist eine Sub-Abfrage mit In (Auswahl) schneller als in ('xx', 'xx' ..)

Select PATH 
from FOLDER 
where ... 

Diese Abfrage eine Liste des Pfades zurückzukehren. (z. B. 600 Zeichen).

Als ich diese Liste der Pfad verwenden und tun eine weitere Anforderung später mit

Select * 
From FOLDER 
WHERE FOLDER.PATH IN ('path1','path2' [...]) 

könnte es mehr als 30 Sekunden dauern.

Wenn ich diese Abfrage tun:

Select * 
From FOLDER 
WHERE 
FOLDER.PATH IN (Select PATH 
    from FOLDER 
    where 
    ...) 

Es dauert weniger als 1 Sekunde.

Ist SQL-Server die Abfrage durchführen und Join?

In diesem Fall, warum auf this post empfehlen sie, die Abfrage mit einem JOIN zu ändern?

+2

Gail Shaw hat einen ausgezeichneten Artikel zu diesem Thema. https://www.sqlinthewild.co.za/index.php/2010/01/12/in-vs-inner-join/ –

Antwort

1

Ich denke, der Grund ist ziemlich einfach (und ich bin mir nicht sicher, dass der in dem Kommentar erwähnte Artikel dies anspricht).

SQL Server führt eine sequentielle Suche in einer in Liste mit Konstanten durch. Das bedeutet, dass für jeden Wert in der Liste, der nicht übereinstimmt, alle Werte verglichen werden müssen. Einige andere Datenbanken optimieren dies, indem sie die Liste sortieren und eine binäre Suche durchführen.

Auf der anderen Seite kann die in mit einer Unterabfrage einen Index verwenden - was im Wesentlichen eine binäre Suche ist. Dies kann insbesondere bei den Werten, die nicht in der Liste enthalten sind, zu einer erheblichen Reduzierung der Berechnung führen.

1

Nach dem Abfrage-Ausführungsplan, IN (mehr Werten) hat eine hoch 'Auswahl Kosten', INNER JOIN und IN (wählen ..) funktionieren auf die gleiche Art und Weise verwendet (Indexsuche) mit geringen Auswahlkosten.

Danke.

Verwandte Themen