Koji je bolji SQL upit:

Koji je bolji SQL upit:
Znači imamo indeksirano polje prema kojem sortiramo podatke, neka je to “datum”, imam sve id-ove redaka(primar key) koje više ne želim učitati, istovremeno znam da svi ti idovi su nekog datuma koji je manji od neke poznate vrijednosti.

Koji je select bolji:

SELECT * FROM table_name WHERE datum>poznatiDatum ORDER BY datum DESC

ili

SELECT * FROM table_name WHERE id NOT IN (poznati id-ovi) ORDER BY datum

??
hvala!

Ako je tih identifikatora malo, onda ti je svejedno. Već sintaksno gledano je drugi upit izgubljena bitka, jer sigurno postoji nekakvo ograničenje na duljinu teksta SQL naredbe koju sustav za upravljanje bazom može uopće “progutati”. Prvi je upit u ovom slučaju “u duhu” upotrebe SQL-a, a ujedno je tako sastavljen tako i u bazi postoje svi elementi da bi se izveo na najoptimalniji način.

Ne mogu općenito reći koji bi od dva upita zahtijevao manji broj nekakvih “koraka” za izvođenje. To možeš provjeriti generiranjem velikog (uistinu velikog) broja zapisa i mjerenjem vremena ili ispisom tzv. plana izvođenja (google: mysql query execution plan).

Prvi upit je klasika. Mesarski “capneš” od - do i gotovo.

Drugi upit je puno finiji, pogotovo ako se izvede s dodatnom tablicom u kojoj se nalaze (ne)željeni ID-ovi.

Zanimljiva dva kontradiktorna odgovora :), očekivao sam da je naravno bolji prvi upit, ili eventualno da je svejedno pošto je u oba slučaja polje po kojem se pretražuje indeksirano.

Nisam skužio @trnac, zašto misliš da je finiji drugi upit??

Uobičajena je pretpostavka da se za jedan datum kreira više ID-ova.
Kažem uobičajena jer u slučaju da je jedan datum = jedan ID, ID gubi smisao.

Stanje je dakle da za jedan datum imamo više ID-ova.
Upitom po datumu ne možemo selektirati određeni ID što upitom po ID-u možemo.
Dakle, upit po ID-u je “finiji”, odnosno daleko precizniji.

Ako trebaš vremenski limitirati podatke, prvi upit je i više nego dobar za tu namjenu.
Dapače, drugi upit je nepotrebna gnjavaža u tom slučaju.

Međutim, ako trebaš limitirati podatke po ID-u, s prvim upitom to niti nećeš moći napraviti.
Moraš koristiti drugi upit odnosno upit po ID-u.