Problém je v tom, že pomocí OR zadáváte dvě podmínky, které se vztahují na samostatné tabulky ve vašem dotazu. Z tohoto důvodu musí hledání indexu bez seskupení vracet většinu nebo všechny řádky ve vaší velké tabulce, protože logika OR znamená, že mohou také odpovídat klauzuli podmínky ve druhé tabulce.
Podívejte se na plán provádění SQL ve všech třech výše uvedených příkladech a všimněte si počtu řádků, které vycházejí z neshlukovaného hledání indexu z velké tabulky. Konečný výsledek může vrátit pouze 1 000 nebo méně z 800 000 řádků v tabulce, ale klauzule OR znamená, že obsah této tabulky musí být křížově odkazován s podmínkou ve druhé tabulce, protože OR znamená, že mohou být potřebné pro finální výstup dotazu.
V závislosti na vašem plánu provádění může hledání indexu vytáhnout všech 800 000 řádků ve velké tabulce, protože mohou také odpovídat podmínkám klauzule OR ve druhé tabulce. UNION ALL jsou dva samostatné dotazy, každý pro jednu tabulku, takže hledání indexu musí vydat pouze menší sadu výsledků, která by mohla odpovídat podmínce pro daný dotaz.
Doufám, že to dává smysl. Při refaktorování pomalu běžících příkazů SQL jsem narazil na stejnou situaci.
Na zdraví,
Andre Ranieri