[ cvele @ 18.08.2001. 14:06 ] @
Koristim sledeci upit

SELECT * FROM adresar LIMIT n,10

gde mi se n svaki put povecava kada predjem na novu stranu ca next i previous.

Kada je baza velika ovaj upit radi sporo jer svaki put se iznova izvrsava ceo upit bez obzira sto ja izdvajam samo 10 sledecih rezultata.

Dali je ovo moguce efikasniji odraditi?
[ cvele @ 18.08.2001. 15:06 ] @
I jos nesto...

kako da dobijem ukupan broj redova koji vraca upit ako u njemu koristim LIMIT.

Dali to znaci da moram jos jednom da izvrsim ceo upit bez LIMIT da bih dobio ukupan broj redova?
[ Gojko Vujovic @ 18.08.2001. 17:21 ] @
Navedi molim te o kojoj je bazi reč.
[ tOwk @ 19.08.2001. 14:51 ] @
Ukoliko to radis iz nekog programskog okruzenja, preporucujem ti da das upit bez limit-a, i da onda sve sto dobijes stavis u neki svoj "cache", i da odatle onda izdvajas 10 po 10.

Ostale vrste optimizacije zavise od baze do baze, ali je pitanje koliko ce one dati dobre rezultate, pa mi se cini da je prethodno jedno od boljih resenja. Naravno, veliki broj problema se javlja sa prethodnim nacinom kao sto je izmena baze izmedju pregleda 10-te strane i prve, kao i to sto ako se vrati stvarno veliki broj podataka, moras rucno da delis podatke stalno na stranice (ali i to je opet mnogo brze od novog upita).

Istina, moguce je koristiti i neko medjuresenje, kao npr. da postavis limit na 10x10=100, umesto 10, i onda to stavis u cache, pa mozes brzo da isporucis sledecih 10 strana, a za 11. moras ponovo da "upitujes".

Toliko.
[ tOwk @ 19.08.2001. 14:56 ] @
E da a sto se tice drugog pitanja, svaki iole ozbiljniji SQL server ce se sam potruditi da ima u cache-u odgovarajuci podatak.

Recimo ako prvo uradis upit u kojem pomocu COUNT dobijas broj podataka, server bi trebao makar malo brze da uradi sledeci upit u kojem ti pozivas isto samo bez COUNT-a. Naravno, zavisi od servera do servera, ali mozda je moguce da ce i neke vrste ugnjezdavanja upita dati dobre rezultate (a ovo sigurno ne moze na MySQL).

Toliko.
[ cvele @ 20.08.2001. 08:28 ] @
Izvinjavam se, nisam napisao da se radi o MySql bazi.
[ tOwk @ 20.08.2001. 14:33 ] @
SQL92 definise i "kurzore" (cursors) koji su zaduzeni upravo za to sto tebi treba...

Pogledaj uputstvo MySQL (koje dolazi uz distribuciju) i pronadji kako se koriste kurzori iz tvog okruzenja (oni ne mogu sa komandne linije, vec samo iz embedded SQL upita, ali neke baze kao sto je pgsql dozvoljavaju i to cak).

Znaci upiti od interesa su "DECLARE CURSORS" i "FETCH", pa sa srecom.

Prema ovome, ukoliko MySQL podrzava kurzore, moje prethodne poruke mozes zanemariti.

Toliko.