Das Problem ist, dass Sie zwei Bedingungen mit OR angeben, die für separate Tabellen in Ihrer Abfrage gelten. Aus diesem Grund muss die Nonclustered-Index-Suche die meisten oder alle Zeilen in Ihrer großen Tabelle zurückgeben, da die ODER-Logik bedeutet, dass sie möglicherweise auch mit der Bedingungsklausel in der zweiten Tabelle übereinstimmen.
Sehen Sie sich den SQL-Ausführungsplan in allen drei obigen Beispielen an und achten Sie auf die Anzahl der Zeilen, die aus der Nonclustered-Index-Suche aus der großen Tabelle stammen. Das endgültige Ergebnis kann nur 1.000 oder weniger der 800.000 Zeilen in der Tabelle zurückgeben, aber die OR-Klausel bedeutet, dass der Inhalt dieser Tabelle mit der Bedingung in der zweiten Tabelle querverwiesen werden muss, da OR bedeutet, dass sie möglicherweise für das Finale benötigt werden Abfrageausgabe.
Abhängig von Ihrem Ausführungsplan kann die Indexsuche alle 800.000 Zeilen in der großen Tabelle abrufen, da sie möglicherweise auch mit den Bedingungen der OR-Klausel in der zweiten Tabelle übereinstimmen. UNION ALL besteht aus zwei separaten Abfragen für jeweils eine Tabelle, sodass die Indexsuche nur die kleinere Ergebnismenge ausgeben muss, die möglicherweise mit der Bedingung für diese Abfrage übereinstimmt.
Ich hoffe das macht Sinn. Ich bin auf die gleiche Situation gestoßen, als ich langsam laufende SQL-Anweisungen umgestaltete.
Tschüss,
André Ranieri