Ich habe eine Aussage, die 10 Sekunden auszuführen auf 10k Artikel in der Tabelle X nimmt:Warum ist meine unkorrelierte Unterabfrage so langsam?
Version 1
SELECT *
FROM X
WHERE pk = 77843
AND (a IS NULL OR a NOT IN (SELECT DISTINCT(b)
FROM X
WHERE pk = 77843
AND l IS NOT NULL))
Die Unterabfrage unkorreliert ist, was bedeutet, dass es zu keinen Bezug hat die äußere Abfrage. Dies bedeutet, dass die Unterabfrage nur einmal ausgeführt werden sollte.
Version 2:
Nun, wenn ich die Unterabfrage und führen die Berechnung extrahieren vorab die Abfrage in < 1s führt.
DECLARE @listOfb table (id int)
INSERT INTO @listOfb(id)
(SELECT DISTINCT(b) as Numbers
FROM X
WHERE pk = 77843
AND l IS NOT NULL)
SELECT *
FROM X
WHERE pk = 77843
AND (a IS NULL OR a NOT IN (SELECT * FROM @listOfb))
Warum ist die Version 2 so viel schneller als Version 1?
aktualisieren
ich hinzugefügt haben 1 ein Ausführungsplan von Version (was ich denke, genannt wird): Die Abfrage um 10k Löschen von Zeilen ist.
Haben Sie sich die ** Ausführungspläne ** für die beiden Abfragen angesehen? –
'DISTINCT' ist keine Funktion (in einer Spalte), sie ist Teil von' SELECT DISTINCT' und arbeitet mit den ganzen ausgewählten Zeilen. Entfernen Sie diese überflüssigen Klammern, um die Dinge klarer zu machen! 'SELECT DISTINCT (a), b ...' ist besser geschrieben als 'SELECT DISTINCT a, b ...', kann aber auch geschrieben werden als 'SELECT DISTINCT a, (b) ...' ... – jarlh
, keine Notwendigkeit, SELECT DISTINCT hier zu tun ... – jarlh