Ich habe ein Leistungsproblem.Multiples INNER JOIN ist zu langsam SQL SERVER
Ich habe eine Tabelle erstellt, die Daten aus einer Datei empfängt, ich mache eine BULK INSERT
. Dann mache ich einen SELECT
mit mehreren INNER JOIN
s (11 innere Joins), um in eine andere Tabelle mit den richtigen Daten einzufügen.
Wenn ich diese SELECT
ausführen, dauert es zu lange (mehr als eine Stunde) und dann höre ich auf. Meine Lösung bestand darin, diese Abfrage in 3 zu unterteilen und @temp
Tabellen zu erstellen. Zu meiner Überraschung dauert das 3 Minuten. Das ist, was ich versuche zu verstehen, warum brechen meine Abfrage in 3 war schneller als eine Select-Anweisung. Hier ist meine Frage:
SELECT t1.ReturnINT, t1.ReturnBIT, t2.ReturnINT, t3.ReturnINT, t5.ReturnINT, t1.ReturnDateTime
FROM t1
INNER JOIN t2
ON t2.my_column_varchar = t1.my_column_varchar
INNER JOIN t3
ON t3.my_column_number = t1.my_column_number AND t2.my_column_ID = t3.my_column_ID
INNER JOIN t4
ON t4.my_column_varchar = t1.my_column_varchar
INNER JOIN t5
ON t5.my_column_int = t1.my_column_int AND t5.my_column_int = t4.my_column_int AND t2.my_column_int = t5.my_column_int
INNER JOIN t6
ON t6.my_column_int = t5.my_column_int AND t6.my_column_int = t2.my_column_int
INNER JOIN t7
ON t7.my_column_int = t6.my_column_int
INNER JOIN t8
ON t8.my_column_int = t3.my_column_int AND t8.my_column_datetime = t1.my_column_datetime
INNER JOIN t9
ON t9.my_column_int = t3.my_column_int AND t8.my_column_datetime BETWEEN t9.my_column_datetime1 AND t9.datetime1 + t9.my_column_datetime2
INNER JOIN t10
ON t10.my_column_int = t9.my_column_int AND t10.my_column_int = t6.my_column_int
INNER JOIN t11
ON t11.my_column_int = t9.my_column_int AND t8.my_column_datetime = t11.my_column_datetime
---- ---- EDITED
gibt es keine where-Klausel, meine Frage ist genau das, wie ich hier setzen.
Hier sind meine gebrochenen Fragen, ich vergesse, sie hier zu setzen. Es läuft in 3 Minuten.
DECLARE @temp TABLE (
<Some_columns>
)
INSERT INTO @temp
SELECT <My_Linked_Columns>
FROM t1
INNER JOIN t2
ON t2.my_column_varchar = t1.my_column_varchar
INNER JOIN t3
ON t3.my_column_number = t1.my_column_number AND t2.my_column_ID = t3.my_column_ID
INNER JOIN t4
ON t4.my_column_varchar = t1.my_column_varchar
INNER JOIN t5
ON t5.my_column_int = t1.my_column_int AND t5.my_column_int = t4.my_column_int AND t2.my_column_int = t5.my_column_int
DECLARE @temp2 TABLE(
<Some_Columns>
)
INSERT INTO @temp2
SELECT <More_Linked_Columns>
FROM @temp as temp
INNER JOIN t6
ON t6.my_column_int = temp.my_column_int AND t6.my_column_int = temp.my_column_int
INNER JOIN t7
ON t7.my_column_int = t6.my_column_int
INNER JOIN t8
ON t8.my_column_int = temp.my_column_int AND t8.my_column_datetime = temp.my_column_datetime
DECLARE @temp3 TABLE(
<Some_Columns>
)
INSERT INTO @temp3
SELECT <More_Linked_Columns>
FROM @temp2 AS temp2
INNER JOIN t9
ON t9.my_column_int = temp2.my_column_int AND temp2.my_column_datetime BETWEEN t9.my_column_datetime1 AND t9.datetime1 + t9.my_column_datetime2
INNER JOIN t10
ON t10.my_column_int = t9.my_column_int AND t10.my_column_int = temp2.my_column_int
INNER JOIN t11
ON t11.my_column_int = t9.my_column_int AND temp2.my_column_datetime = t11.my_column_datetime
SELECT <All_Final_Columns>
FROM @temp3
---- EDITED 3 ----
mehr Dinge Studium habe ich ein Problem in Ausführungsplan entdeckt. Ich habe eine verschachtelte Schleife, die 1 Zeile schätzt, aber tatsächlich 1.204.014 Zeilen zurückgibt. Ich denke, das Problem genau hier ist, aber ich habe nicht herausfinden, wie dieses Problem zu lösen, ohne meine Frage in 3 Teile zu brechen (jetzt weiß ich, warum es zu brechen ist schneller hehehe)
Dies könnte eine beliebige Anzahl von Dingen sein. Es könnte indizieren, es könnte sein, dass Sie nonSARGable Prädikate haben, wenn es eine where-Klausel gibt, die Liste könnte weiter und weiter gehen. Ohne einige tatsächliche Details gibt es wenig, was jemand tun kann, außer zu erraten, was das langsam macht. –
Es reduziert die Auswahlmöglichkeiten für Optimizer, um die Join-Reihenfolge und den Join-Typ zu bestimmen –