[ karas @ 10.10.2006. 09:59 ] @
Da li npr.

Code:

SELECT * FROM temp;


i

Code:

SELECT * FROM temp LIMIT 10;


imaju isto vreme izvršavanja? Tj. hoće li Postgres prekinuti pretragu čim nađe 10 redova ili će proći kroz celu tabelu ali prikazati samo 10 redova?
Isto pitanje ako postoji ORDER bo indeksiranoj koloni.
[ chachka @ 10.10.2006. 22:51 ] @
Ovo je lako praktično proveriti.

Upotreba LIMIT-a (čak i u varijaciji sa OFFSET-om) značajno skraćuje vreme fetch-ovanja redova tabele.
[ karas @ 11.10.2006. 08:36 ] @
Ako pozivam takav upit iz aplikacije nekad mi se čini da nema razlike. Neki put i iz samog psql-a treba mu podosta vremena.
Ovo pitanje otuda što sam koristio LIMIT/OFFSET upite sa podupitima. Kako je podupit uvek isti razmišljao sam o keširanju tog podupita zbog ubrzanja. Ne znam da li je to moguće izvesti preko kursora ili kako već.
[ chachka @ 11.10.2006. 11:00 ] @
Citat:
... nekad mi se čini da nema razlike.

Razlika je uočljiva tek pri velikom odnosu broja članova nelimitiranog skupa i broja članova limitiranog skupa - recimo ako je taj odnos reda veličine 2, 3 i više.

Citat:
Kako je podupit uvek isti ...

Ovo tumačim da je podupit nezavisan od glavnog upita. U tom slučaju query planner pravi plan izvršavanja tako da se podupit izvršava samo jednom, te se ti rezultati nakon toga povezuju sa ostatkom upita. Dakle nema potrebe za keširanjem.

U slučaju da glavni upit izvršavaš više puta a da ti je pri svim tim izvršavanjima rezultat podupita uvek isti, onda možeš keširati rezultat podupita upotrebom privremenih tabela ili upotrebom običnih tabela. Tada se podupit svodi na prosto selektovanje svih članova pomoćne tabele. Odnosno:
Code:

SELECT *
  FROM neka_tabela
 WHERE neki_atribut IN (podupit);

se može transformisati u
Code:

CREATE TEMPORARY TABLE tt_podupit AS
  podupit;

SELECT *
  FROM neka_tabela
 WHERE neki_atribut IN (SELECT * FROM tt_podupit);
[ karas @ 11.10.2006. 11:56 ] @
Da, da, ovo sa privremenom tabelom bi trebalo da radi posao - hvala.