sql >> Databasteknik >  >> RDS >> Sqlserver

UNION ALL vs OR-villkor i SQL-serverfrågan

Problemet är att du anger två villkor med OR som gäller för separata tabeller i din fråga. På grund av detta måste den icke-klustrade indexsökningen returnera de flesta eller alla raderna i din stora tabell eftersom OR-logik betyder att de också kan matcha villkorssatsen i den andra tabellen.

Titta på SQL-exekveringsplanen i alla tre exemplen ovan och lägg märke till antalet rader som kommer ut från den icke-klustrade indexsökningen från den stora tabellen. Det slutliga resultatet kan bara returnera 1 000 eller färre av de 800 000 raderna i tabellen men OR-satsen innebär att innehållet i den tabellen måste korsreferens med det villkorliga i den andra tabellen eftersom OR betyder att de kan behövas för den sista frågeutgång.

Beroende på din exekveringsplan kan indexsöket dra ut alla 800 000 rader i stora tabeller eftersom de också kan matcha villkoren för ELLER-satsen i den andra tabellen. UNION ALL är två separata frågor mot en tabell vardera, så indexsökningen behöver bara mata ut den mindre resultatuppsättningen som kan matcha villkoret för den frågan.

Jag hoppas att detta är vettigt. Jag har stött på samma situation när jag omstrukturerade långsamma SQL-satser.

Skål,

Andre Ranieri



  1. Hur returnerar man en RefCursor från Oracle-funktionen?

  2. Lär känna funktionerna och funktionerna i MariaDB SkySQL

  3. SQL Server Databas Snapshots -4

  4. Oracle WHILE LOOP Exempel