Abfrageoptimization in SQL server

SELECT T2.Entity1Id, T1.Entity1Id FROM T1 FULL OUTER JOIN T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 WHERE ((T1.c1 = 123 ) OR (T2.c1 = 123)) AND (T1.c3 = 1 OR T1.c3 IS NULL) 

Die Abfrage dauert 12 Sekunden in SQL server 2014, eine Idee, die Abfrage zu stimmen? Es gibt Indizes für C1, C2, C3 Spalten.

Beobachtung: in der obigen Abfrage, wenn ich eine Bedingung von OR (dh

 SELECT T2.Entity1Id, T1.Entity1Id FROM T1 FULL OUTER JOIN T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 WHERE (T1.c1 = 123) AND (T1.c3 = 1 OR T1.c3 IS NULL) 

dann kehrt es in 0 Sekunden zurück.

Jeder Tisch hat rund 500'000 datasätze.

Zuerst ist die (T1.c3 = 1 OR T1.c3 IS NULL) redundant. Angesichts der join Bedingung sind dies die einzigen möglichen Werte. Also, die Abfrage ist:

 SELECT T2.Entity1Id, T1.Entity1Id FROM T1 FULL OUTER JOIN T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 WHERE (T1.c1 = 123 ) OR (T2.c1 = 123) 

Wenn dies keine gute performance hat, dann brechen Sie dies in zwei Abfragen:

 SELECT T2.Entity1Id, T1.Entity1Id FROM T1 LEFT JOIN T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 WHERE T1.c1 = 123 UNION SELECT T2.Entity1Id, T1.Entity1Id FROM T2 LEFT JOIN T1 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 WHERE T2.c1 = 123 

Manchmal ist die Optimierung der separaten Unterabfragen viel besser als die Optimierung für den full outer join .