sql >> Databáze >  >> RDS >> Sqlserver

UNION ALL vs OR podmínka v dotazu serveru SQL

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



  1. Jak vybrat nejnovější sadu datovaných záznamů z tabulky mysql

  2. Příklad příkazu Oracle FOR LOOP SELECT

  3. Spojení výsledků ze dvou samostatných databází

  4. Automatizace tabulkového modelu zpracování databází Analysis Services (SSAS) na serveru SQL Server