ďťż
Podstrony
|
telcocafemam 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. |
|||
Sitedesign by AltusUmbrae. |