[ obucina @ 01.09.2005. 15:57 ] @
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] |