Tu już nawet nie chodzi o optymalizację ale o dosłowne mordowanie bazy danych.
Po pierwsze. Konstrukcja łączenia tabel bez użycia instrukcji INNER JOIN, LEFT JOIN itd. nadaje się do używania przez przedszkolaków. Jak ktoś nie wierzy to niech sobie zrobi najprostszą kwerendę w MSAccess i zobaczy, że nawet głupi Acces od razu tworzy instrukcji INNER.
Łączenie tabel winno się odbywac następująco:
[sql:1:d05366fede]
SELECT tabela1.pole2,tabela2.pole2 FROM tabela1 INNER JOIN tabela2 ON tabela1.pole1=tabela2.pole1 where tabela1.pole4 LIKE '%tra la la%'
[/sql:1:d05366fede]
Po drugie indeksy, indeksy i jeszcze raz indeksy. Na kazdym kroku gdzie łączy się tabele należy używac indeksów jako kluczy łączących tabele. W przeciwnym razie zapytanie do bazy może być tak bolesne że obciąży procesor w 100% i zawiesi komputer.
Jeśli ktoś sobie nie radzi lub wręcz zapisanie tego co sie chce zrobić w jednym zapytaniu jest niemożliwe to nikomu korona z głowy nie spadnie jak rozłoży zapytanie na kilka podzapytań, których wyniki załaduje do nowych tabel (temporary table), uworzy w nich indeksy i wykona ostateczne zapytanie.
Przestudiowanie 3 prostych zapytań jest 100 razy szybsze niż ślęczenie 6 godzin nad zapytaniem w którym użyto 4 instrukcje IF jedna w drugiej.
A oto przykładowe zapytanie do bazy na której pracuję i niech ktoś spróbuje zapisać takie zapytanie bez INNERÓW

:
[sql:1:d05366fede]
#zrzuty na pktach zlewnych
drop table polacz15;
create temporary table polacz15 select distinct nr_polacz from polaczenia where polaczenia.adres like '%cieki%zlewny%' or polaczenia.adres like '%cieki%wykaz%';
alter table polacz15 add primary key(nr_polacz);
#Zużycia na punkcie zlewnym
select count(distinct symb_polacz),rach.taryfa,platnik.symb_plat,platnik.nazwa,polaczenia.symb_polacz,
olaczenia.adres,
sum(if(rach.taryfa like '_R' or rach.taryfa like '_W',rach.zuzycie-ifnull(rach_1.zuzycie,0),0)) as woda,
sum(if(rach.taryfa like '_R' or rach.taryfa like '_S',rach.zuzycie-ifnull(rach_1.zuzycie,0),0)) as scieki
from polacz15
left join rach on polacz15.nr_polacz=rach.nr_polacz
left join rach as rach_1 on rach.rach_rekl_nr=rach_1.nr_rach and rach.nr_plat=rach_1.nr_plat and rach.nr_polacz=rach_1.nr_polacz and
rach.nr_lewego=rach_1.nr_lewego and rach.taryfa=rach_1.taryfa and rach.cena_wody=rach_1.cena_wody and rach.cena_sciekow=rach_1.cena_sciekow
inner join polaczenia on rach.nr_polacz=polaczenia.nr_polacz
inner join platnik on rach.nr_plat=platnik.nr_plat
where
rach.rok_spr=2004 and rach.mies_spr=1
group by taryfa
order by symb_plat
[/sql:1:d05366fede]
Pozdrawiam