group by vs distinct - wydajnosc
blochoo - 18-03-2006 01:15
group by vs distinct - wydajnosc
Witam,
mam 2 tabele: klienci i zakupy. W skrocie ich schemat wyglada tak:
klienci (id_klienta, nazwisko) ~ 100 tys rekordow. zakupy(id_towaru, id_klienta, data) ~ 500 tys rekordow.
Oczywiscie klient moze miec (0,n) wpisow w tabeli zakupy. Chce znalezc wszystkich klientow, ktorzy zrobili zakupy od dnia 'x' do dnia 'y'.
Jakie zapytanie jest wg Was najbardziej wydajne i dlaczego?
1. join na (klienci, zakupy) i potem robienie group by po id_klienta? 2. join na (klienci, zakupy) i select z klauzula distinct? 3. select nazwisko from klienci where id_klienta in (select id_klienta from zakupy where data.....))) 4. Podobne zapytanie jak 3. tylko z uzyciem exists
Pozdrawiam, blochoo CS@PP
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 18-03-2006 01:15
"blochoo" <piotr.bloch@gmail.com> wrote: > mam 2 tabele: klienci i zakupy. W skrocie ich schemat wyglada tak: To ja sie na początek przyczepię od razu:
1. Dlaczego w skrócie? Zadajesz pytanie, czyli oczekujesz, że ktoś Ci pomoże, a nie chce Ci się poświęcić odrobiny czasu, żeby porządnie opisać problem. 2. Nie napisałeś jaka baza danych, nie napisałeś jakie masz indeksy, nie napisałeś jaki jest rozkład danych (sama ilość to za mało). 3. Czemu opowiadasz o tabelach, zamiast po prostu podać ich definicje? Wtedy każdy, kto chciałby się z Twoim problemem zmierzyć, po prostu wykonałby u siebie odpowiednie CREATE... i mógł się pobawić, sprawdzić, potestować. 4. Dlaczego opowiadasz o zapytaniach, zamiast podać ich treść? 5. Dlaczego nie wykonasz u siebie tych zapytań i nie porównasz czasów odpowiedzi, żeby samemu odpowiedzieć na to pytanie?
> Jakie zapytanie jest wg Was najbardziej wydajne i dlaczego? Według nas?! A jakie to ma znaczenie? Wydajność nie jest kwestią opinii, tylko faktów.
> 1. join na (klienci, zakupy) i potem robienie group by po id_klienta? Nie wiem co masz na myśli.
> 2. join na (klienci, zakupy) i select z klauzula distinct? Zapytanie z IN wykonuje się w ten właśnie mniej więcej sposób (przynajmniej w Oracle). Podzapytanie jest obliczane, robiony jest DISTINCT, a potem złączenie z wynikiem zewnętrznego zapytania.
> 3. select nazwisko from klienci where id_klienta in (select id_klienta > from zakupy where data.....))) > 4. Podobne zapytanie jak 3. tylko z uzyciem exists IN jest generalnie lepszy od EXISTS, jeśli główne zapytanie zwraca dużo danych, a podzapytanie mało. EXISTS jest generalnie lepsze, jeśli na zewnątrz masz mało danych, a w podzapytaniu dużo.
Ja bym w pierwszym podejściu (odruchowo) napisał wariant z IN i jest duża szansa, że byłby on najwydajniejszy. Ale jeszcze raz się pytam - po co zgadywać, skoro można to po prostu sprawdzić? Zwłaszcza, że jak rozumiem pytanie ma jedynie zaspokoić Twoją ciekawość, bo gdybyś faktycznie miał problem z wydajnością zapytania, to powiedziałbyś, której wersji aktualnie używasz i co jest z nią nie tak...
-- Michał Kuratczyk
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Luminacja vs luminancja
MS SQL 2005 vs MS SQL 2000
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
mysql+php - =?ISO-8859-2?Q?wydajno=B6=E6_przy_olbrzymiej_i?==?ISO-8859-2?Q?lo=B6ci_rekord=F3w?=
[ORACLE] Dodanie kolumny typu BLOB - =?ISO-8859-2?Q?wp=B3yw_na?==?ISO-8859-2?Q?_wydajno=B6c?=
photoshop vs photoshop elements
Fujitsu Siemens LCD VS. Eizo LCD
Macromedia Flash 8 vs Flash MX 2004
[MySQL] problem z kwerenda MySQL 4.1.21 vs 5.0.11
[mysql] CONCAT agregujący, ale nie GROUP_CONCAT()
zanotowane.pldoc.pisz.plpdf.pisz.plautwywalczyl.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|