Het probleem is dat u twee voorwaarden specificeert met OR die van toepassing zijn op afzonderlijke tabellen in uw query. Daarom moet de niet-geclusterde indexzoekopdracht de meeste of alle rijen in uw grote tabel retourneren, omdat OR-logica betekent dat ze mogelijk ook overeenkomen met de voorwaardeclausule in de tweede tabel.
Kijk naar het SQL-uitvoeringsplan in alle drie de bovenstaande voorbeelden en let op het aantal rijen dat uit de niet-geclusterde index komt uit de grote tabel. Het uiteindelijke resultaat retourneert mogelijk slechts 1.000 of minder van de 800.000 rijen in de tabel, maar de OR-clausule betekent dat er moet worden verwezen naar de inhoud van die tabel met de voorwaardelijke in de tweede tabel, aangezien OR betekent dat ze mogelijk nodig zijn voor de uiteindelijke uitvoer opvragen.
Afhankelijk van uw uitvoeringsplan kan de indexzoekfunctie alle 800.000 rijen in de grote tabel eruit halen, omdat ze mogelijk ook overeenkomen met de voorwaarden van de OR-clausule in de tweede tabel. De UNION ALL is twee afzonderlijke zoekopdrachten tegen elk één tabel, dus de indexzoekopdracht hoeft alleen de kleinere resultatenset uit te voeren die mogelijk overeenkomt met de voorwaarde voor die zoekopdracht.
Ik hoop dat dit zinvol is. Ik ben dezelfde situatie tegengekomen tijdens het refactoren van langzaam lopende SQL-instructies.
Groetjes,
Andre Ranieri