Problemet er, at du angiver to betingelser med OR, der gælder for separate tabeller i din forespørgsel. På grund af dette skal den ikke-klyngede indekssøgning returnere de fleste eller alle rækkerne i din store tabel, fordi OR-logik betyder, at de muligvis også matcher betingelsesklausulen i den anden tabel.
Se på SQL-udførelsesplanen i alle tre eksempler ovenfor, og læg mærke til antallet af rækker, der kommer ud af den ikke-klyngede indekssøgning fra den store tabel. Det endelige resultat kan kun returnere 1.000 eller færre af de 800.000 rækker i tabellen, men OR-sætningen betyder, at indholdet af denne tabel skal krydshenvises til det betingede i den anden tabel, da OR betyder, at de kan være nødvendige for den endelige tabel forespørgsels output.
Afhængigt af din eksekveringsplan kan indekssøgningen trække alle 800.000 rækker ud i den store tabel, fordi de også kan matche betingelserne i OR-klausulen i den anden tabel. UNION ALL er to separate forespørgsler mod én tabel hver, så indekssøgningen skal kun udskrive det mindre resultatsæt, der kan matche betingelsen for den forespørgsel.
Jeg håber, det giver mening. Jeg er stødt på den samme situation, mens jeg refaktorerede langsomt kørende SQL-sætninger.
Skål,
Andre Ranieri