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.

Elválasztó

Már készül a következő cikk. Iratkozzon fel az értesítőre.

|

Kővári Attila
2011. május 24.

Ilyen nincs már? SELECT * FR

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, a

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 al

É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)

Szóljon hozzá!

Szabály: Legyen kedves, segítõkész és vállalja a nevét.
A mező tartalma nem nyilvános.
  • A web és email címek automatikusan linkekké alakulnak.
  • Engedélyezett HTML elemek: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • A sorokat és bekezdéseket automatikusan felismeri a rendszer.
ANTI SPAM
A robot regisztrációk elkerülésére.
Image CAPTCHA
Figyeljen a kis és nagybetűk használatára