[ galisnik @ 09.02.2005. 18:28 ] @
Riste, tipujem na tebe!

Konvertujem accessovu bazu u firebird bazu, prilicno jednostavno sam prebacio tabele i podatke pomocu aplikacije SQL2GBK (ili tako nekako) no kada sam dosao do prebacivanja upita pojavili su se vrlo nezgodni problemi.
Znam da firebird ne podrzava izvedene tabele (podupite u FROM klauzuli), to rjesavam sa dva Viewa, ali sa JOIN-ovima i NULL vrijednostima nikako da izadjem na kraj. Npr. upit koji se u Accessu izvrsi za 5-6 sekundi (koristi drugi upit koji se sastoji od tri selecta povezana sa UNION ALL i sadrzi LEFT JOIN-ove) kad to prebacim u firebird i pokrenem (a podaci su potpuno identicni) on jadan radi i do 10-ak minuta, a u najvecoj tabeli jedva da ima 15000 slogova. Tu dolazimo do drugog nezgodnog ogranicenja sadasnje verzije firebirda - neshvatljivo mala max velicina indeksa (252 bajta koliko sam vidio na jednom sajtu), tako da ne mogu dodati jos jedan slozeni indeks koji treba da indeksira dva polja zajedno, a oni se koriste kao PuniNaziv (Naziv+Oznaka).
To me je jako rastuzilo, jer to je strasno sporo.
Ima li neko neku ideju koja bi mi pomogla, ili cu morati traziti drugu bazu?
Cujem da PostgrSQL ima ocajnu podrsku za nasa slova, a i nije bas pogodan za manje sisteme, MySQL jos nije napravio Trigere i uskladistene procedure (jos nisu izdali production release), a nema ni besplatnog online backup alata, cini mi se da je MSDE tu najblizi, ali mi se ne svidja ono degradiranje performansi kad se koristi vise od 5 konkurentnih konekcija.
Sta kazu, kad ce prva test verzija Firebird 2.0 da izadje? Cuo sam da ce donijeti dosta optimizacija, derivirane tabele i nadam se, povecati max velicinu indeksa.
[ Riste Pejov @ 09.02.2005. 22:47 ] @
Firebird ce _oficijalno_ podrzavati izvedene tabele u verziji 2.0. Neoficijalno FB podrzava ovakve konstrukte jos odavno ali se to zovu select procedure. Zelim reci da ti mozes konstruirati Stored Proc koju nadajle mozes koristiti kao tabelu. Primer:

Code:

create table test_tbl (test_fld varchar(20));

SET TERM !! ;
create procedure selectable_proc returns(test varchar(20))
as
begin
for select test_fld from test_tbl into :test do suspend;
end!!
SET TERM ; !!


i onda samo .... select * from selectable_proc;

Sto se tice sporog execution plana, daj strukturu tabele i select-e koje koristis, siguran sam da ima boljeg resenja. Ako ti je broj kolona ili velicina podatka koje trebas index-irati prevelika no sto FB/IB podrzava onda valjda trebas ponovo razmotriti dizajn baze.

[ galisnik @ 10.02.2005. 19:35 ] @
To sa uskladistenim procedurama je ok ali ne vidim kako moze pomoci kao podupit, npr. neki bezveze upit:

SELECT T.col1, T.Col2
FROM
(SELECT col1, AVG(col2) FROM tabela GROUP BY col1 HAVING col2>0) AS T1 WHERE t.col1=5;

Znaci ovaj drugi select (podupit, izvedenu tabelu) trebam realizovati ili kao VIEW ili kao uskladistenu proceduru, zar ne? No to i nije problem. Bio sam slobodan pa sam ti na mail poslao shemu tabela i view-a koji su mi sporni.

I reci mi po tvom misljenju sta je bolje: CREATE VIEW ili CREATE PROCEDURE za realizaciju druge tabele? Jer ocito je da dva SELECT-a ne mozemo izbjeci.
[ Riste Pejov @ 14.02.2005. 09:18 ] @
Dizajn tvoje baze nije uopste naivan zadatak. To ipak treba fino razmotriti i nazalost ti niko ne moze puno pomoci putem maila i sa pregledanjem nabrzaka nekoliko upita i stored procedura.

Uradi ER dijagram tvoje baze i izpocetka pogledaj dali mozda postoji bolje resenje.

A o tome sto je bolje ... dali PROC ili VIEW, to je ipak sasvim razlicita namena ove dve strukture. U proceduru mozes implementirati vise automatizovanje, ali ne mozes u njoj insertovati ili updateovati podatke. Kad radis sa VIEW-om, onda mozes da insert/update. Tako da ... sto tebi vise odgovara .. ne znam :) ali je se radi o read-only podataka sa puno kalkulacija ... onda stored proc.
[ galisnik @ 14.02.2005. 21:53 ] @
Citat:
U proceduru mozes implementirati vise automatizovanje, ali ne mozes u njoj insertovati ili updateovati podatke.


Zelim da vjerujem da nisam dobro razumio ovu recenicu, Riste. Jer, nije mi jasno iz kojeg razloga uskladistene procedure ne mogu da se koriste za insert i update podataka. Problemi sa performansama ili?
[ Riste Pejov @ 15.02.2005. 09:49 ] @
Ma ne ... nisi me razumeo .... mislio sam na:
Code:

create table test_tbl (test_fld varchar(20));

SET TERM !! ;
create procedure selectable_proc returns(test varchar(20))
as
begin
for select test_fld from test_tbl into :test do suspend;
end!!
SET TERM ; !!


E sada ne mozes: INSERT INTO selectable_proc (test) VALUES("bla")

A ako koristis view umesto stored proc, to mozes uraditi :)