Mislio sam da je ovo greška u optimizaciji upita na Firebird-u,
ali sam dobio odgovor da nije. Dakle, u pseudo kodu:
create procedure (param integer)
begin
for select * from table t
where (:param is null) or (t.field = :param)
suspend;
end
Namera je da se omogući da procedura vrati sve slogove ako parametar nije prosleđen.
Mogući su i drugi uslovi u WHERE klauzuli. SELECT je veliki, ima po 5-6 JOIN-a i tri elementa UNION.
Kada je parametar prosleđen, dobijam neindeksirana čitanja svih slogova u tabeli,
što rezultuje katastrofalno sporim izvršavanjem (300000 neindeksiranih čitanja,
naspram ~150 indeksiranih koliko mi je potrebno).
Kako rešavate slične situacije, tj kako bi omogućili pomenuto ponašanje procedure?
Zbog veličine SELECT-a, ne dolazi u obzir nešto tipa
if param is null then
for select *
else
for select *
[Ovu poruku je menjao obucina dana 01.09.2005. u 17:01 GMT+1]