ďťż

[SQL] optymalizacja zapytania

       

Podstrony


telcocafe

mam zapytanie:
select webzamowienia.id, webzamowienia.data, webzamowienia.status, (select sum(cenad * ilosc) from webrezerwacje where idlisty = webzamowienia.id) as sr, (select sum(ilosc) from webrezerwacje where idlisty = webzamowienia.id) as cr, (select sum(cenadeklarowana) from webelementyzamowienia where idlisty = webzamowienia.id) as sz, (select count(*) from webelementyzamowienia where idlisty = webzamowienia.id) as cz from webzamowienia where idklienta = 1 order by webzamowienia.id desc
ale jak widać przelatuje ono przez 2 tabele po 2 razy. co zrobić, aby zwiększyć wydajność tego zapytania?
Użytkownik unique.id edytował ten post 18 kwiecień 2010, 09:59


Rozbić podzapytania na oddzielne zapytania i wstawić gotowe wartości do zapytania finalnego (podzapytania nie używają indeksów). Denormalizować liczniki i inne podobne dane tak by nie trzeba było dodatkowych zapytań.
Użytkownik Riklaunim edytował ten post 18 kwiecień 2010, 13:01
A jak wyglądają te trzy tabele? Może wystarczyłyby dwie zamiast trzech albo, tak jak wspomniał Riklaunim, stwórz cztery dodatkowe pola w tabeli webzamowienia i aktualizuj je po zmianie zamówienia.


Rozbić podzapytania na oddzielne zapytania i wstawić gotowe wartości do zapytania finalnego (podzapytania nie używają indeksów). Denormalizować liczniki i inne podobne dane tak by nie trzeba było dodatkowych zapytań.
rozbić podzapytania na oddzielne zapytania? czyli przy wstawieniu tego w pętlę to dla każdego wyniku zapytania głównego mam wysyłać dodatkowe zapytania? ... trochę nie bardzo to pasuje...

A jak wyglądają te trzy tabele? Może wystarczyłyby dwie zamiast trzech albo, tak jak wspomniał Riklaunim, stwórz cztery dodatkowe pola w tabeli webzamowienia i aktualizuj je po zmianie zamówienia.
w tej chwili tabele wyglądają tak:

webzamowienia:
id int(4)
idklienta int(11)
data date
status int(1)

webrezerwacje:
id int(11)
idlisty int(11) //id z tabeli webzamowienia
nazwa varchar(100)
cenad float(8,2)
ilosc int(4)

webelementyzamowienia:
id int(11)
idlisty int(11) //id z tabeli webzamowienia
nazwa varchar(100)
cenadeklarowana float(8,2)

wszystkie pola są NOT NULL
ale chyba będzie trzeba zrobić tak jak mówicie, czyli dodać 4 pola do tabeli głównej i zliczać je podczas modyfikacji dodatkowych tabel



Baza danych to nie kalkulator - wszystkie liczniki i podobne historie powinny być denormalizowane - tak by pobieranie danych tylko je pobierało a nie jeszcze przetwarzało.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.