Melyik a gyorsabb: Union vagy OR?

Lejegyzetelem ide, hogy néha jobb eredményt ad ha a WHERE feltételben megadott szűréseket szétbontjuk, és két vagy több lekérdezés uniójával állítjuk elő. Mutatom.

--Query 1 : OR

SELECT * FROM Sales.SalesOrderDetail
WHERE
 ProductID = 714 OR
 ProductID =709 OR
 ProductID =998 OR
 ProductID =875 OR
 ProductID =976 OR
 ProductID =874

--Query 2 : UNION

SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 714
UNION
SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 709
UNION
SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 998
UNION
SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 875
UNION
SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 976
UNION
SELECT * FROM Sales.SalesOrderDetail
WHERE ProductID = 874

Mikor ad jobb eredményt az egyik vagy a másik megoldás? Ez sajnos a lekérdezésektől függ, így ki kell próbálni. Mindenesetre lejegyzetelem ide, hogy alternatívaként jó lehet majd optimalizálásnál. További részletek az sql-server-performance.com-on.

Kővári Attila - BI projekt

hozzászólás

Ilyen nincs már? SELECT * FROM Sales.SalesOrderDetail WHERE ProductID in (714, 709, 998, 875, 976, 874) OR, AND esetén figyelni kell arra, hogy valamilyen sorrendben megy a kiértékelés (oracle talán balról jobbra), az első True (or), False (and) esetén a kifejezés eldől, tovább nem értékeli. Ha ismert a adatbázis eloszlása, akkor a sorrenddel is lehet játszani. Pl a fenti esetben, ha a termékek zöme 874, akkor azt tenném előre stb...

Nem mindegy? Ha jól értem, akkor az ilyen típusú lekérdezések esetiek. Ha igen, akkor nem szenvedek az úniós begépelgetesével, elegánsabb egy IN, ami meg OR.

És még gyorsabb, ha union all-t használsz, mert nem futtat rá distinct-et. (Nem is kell, hiszen a szűrő miatt úgyis diszjunkt halmazok az eredmények)

Új hozzászólás