Ciekawosta =?iso-8859-2?q?wydajno=B6ci?= DISTINCT i GROUP BY na PostgreSQLu
Filozof - 04-11-2005 23:17
Ciekawosta =?iso-8859-2?q?wydajno=B6ci?= DISTINCT i GROUP BY na PostgreSQLu
Witam
Pracujac z bazami dużymi danych na bazie PostgreSQL (kilkaset tysięcy rekordow) zauwazylem ciekawe i jednoczesnie niespodziewane czasy wykonania ponizszych zapytan:
select "Client" as "Browser" from "tblAccessLog" group by "Browser"; - 1,94sek
select distinct "Client" as "Browser" from "tblAccessLog"; - 13,94sek
Oczywiscie oba zapytania zostaly wykonane na tym samym zestawie rekordow ;). Wyniki wydaja mi sie nieco paradoksalne albowiem oczekiwalbym, ze zapytanie drugie wykona sie szybciej jakoze jest (z zalozenia) przystosowane do wyszukiwania duplikatow.
Moze ktos kto zna nieco blizej parser i optymalizator zapytan PostgreSQLa i zna odpowiedz na pytanie: Skąd się biora takie dziwolagi?
Pozdrawiam
Artur Muszynski - 04-11-2005 23:17
> select "Client" as "Browser" from "tblAccessLog" > group by "Browser"; - 1,94sek > > select distinct "Client" as "Browser" > from "tblAccessLog"; - 13,94sek > > Oczywiscie oba zapytania zostaly wykonane na tym samym zestawie rekordow > ;). Wyniki wydaja mi sie nieco paradoksalne albowiem oczekiwalbym, ze > zapytanie drugie wykona sie szybciej jakoze jest (z zalozenia) > przystosowane do wyszukiwania duplikatow. > > Moze ktos kto zna nieco blizej parser i optymalizator zapytan PostgreSQLa > i zna odpowiedz na pytanie: Skąd się biora takie dziwolagi?
A nie ma na to wpływu ilość zwracanych rekordów w obu przypadkach? Jakie to są u ciebie wartości?
artur
> > Pozdrawiam
Filozof - 04-11-2005 23:17
On Wed, 02 Nov 2005 22:43:19 +0100, Artur Muszynski wrote:
>> select "Client" as "Browser" from "tblAccessLog" >> group by "Browser"; - 1,94sek >> >> select distinct "Client" as "Browser" >> from "tblAccessLog"; - 13,94sek >> >> Oczywiscie oba zapytania zostaly wykonane na tym samym zestawie rekordow >> ;). Wyniki wydaja mi sie nieco paradoksalne albowiem oczekiwalbym, ze >> zapytanie drugie wykona sie szybciej jakoze jest (z zalozenia) >> przystosowane do wyszukiwania duplikatow. >> >> Moze ktos kto zna nieco blizej parser i optymalizator zapytan PostgreSQLa >> i zna odpowiedz na pytanie: Skad sie biora takie dziwolagi? > > A nie ma na to wpływu ilość zwracanych rekordów w obu przypadkach? > Jakie to są u ciebie wartości? >
Na pewno ma jakis wplyw. Czasy jakie podalem zostaly odczytane z paska stanu PgAdmin3 z pominięciem czasu potrzebnego na zaladowanie danych do okna wynikow.
Przy wykonaniu podobnego zapytania na tej samej tabeli na polu mniej zróznicowanym czasy rowniez byly rozbiezne na niekorzysc DISTINCT. Zwroconych wynikow bylo dokaldnie 2, a czasy wynosily 1,099 sek i 2,316sek.
> > Jakie to są u ciebie wartości? >
Analizowane pole w obu przypadkach jest typu text. Ilosc rekordow zwroconych w przypadku pierwszym wynosi dokladnie 1346.
> >> Pozdrawiam >
Artur Muszynski - 04-11-2005 23:17
>>> select "Client" as "Browser" from "tblAccessLog" >>> group by "Browser"; - 1,94sek >>> >>> select distinct "Client" as "Browser" >>> from "tblAccessLog"; - 13,94sek >>> >>> Oczywiscie oba zapytania zostaly wykonane na tym samym zestawie rekordow >>> ;). Wyniki wydaja mi sie nieco paradoksalne albowiem oczekiwalbym, ze >>> zapytanie drugie wykona sie szybciej jakoze jest (z zalozenia) >>> przystosowane do wyszukiwania duplikatow. >>> >>> Moze ktos kto zna nieco blizej parser i optymalizator zapytan >>> PostgreSQLa >>> i zna odpowiedz na pytanie: Skad sie biora takie dziwolagi?
Zdaje się jest tak, że distinct tworzy wynik, potem go sortuje i usuwa duplikaty, czyli to co musi robić w ogólnym przypadku - tutaj masz tylko szczególny przypadek, w którym mógłby tego nie robić. Przy group by jak widać bardziej się wysilili, co widać po EXPLAIN - może dlatego, że agregacje sa często stosowane i grupuje się po kolumnach, na których powinien być założony indeks. Distinct jest tym dla SQL, co goto dla C, więc pewnie dlatego nie jest dobrze zoptymalizowany.
artur
=?UTF-8?B?TWljaGHFgg==?= - 04-11-2005 23:17
Artur Muszynski wrote: > powinien byĂŚ zaÂłoÂżony indeks. Distinct jest tym dla SQL, co goto dla C, wiĂŞc > pewnie dlatego nie jest dobrze zoptymalizowany.
dosc ryzykowne porownanie ;)
pozdr, -- mgl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
zanotowane.pldoc.pisz.plpdf.pisz.ploefg.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 |
|