[postgresql] Jak =?ISO-8859-2?Q?przyspieszy=E6_zapytanie?=
Jan Raburski - 16-05-2006 00:15
[postgresql] Jak =?ISO-8859-2?Q?przyspieszy=E6_zapytanie?=
Witam,
trzeba policzyć stany magazynowe na dowolny dzień. parametrami są: ListaMagazynow, ListaKategorii i Dzien ListaMagazynow=tekst z numerami magazynów rozdzielone '/', np. '01/02' Jeśli pusty to wszystkie magazyny ListaKategorii=tekst z numerami kategorii rozdzielone '/', np. 'AB/17' Jeśli pusty to wszystkie kategorie tabele: ka-kategorie towarów, a-artykuły, om-obroty magazynowe indeksy na om wg : artykul_id, data, magazyn_id, dokument_id typ='P' oznacza przyjęcie, 'W'-wydanie z magazynu Dodatkowo jeśli występuje dokument o typie 'BO', to należy przyjąć go jako stan początkowy, pomijając dane z wcześniejszą datą.
Zapytanie działa, tyle tylko, że na 400 tys wierszy około 10 minut. Gdzie jest wąskie gardło i co można zmienić, żeby działało szybciej ?
SELECT ka.opis, a.artykul_id, a.nazwa,
sum(CASE WHEN om.typ='P' THEN om.ilosc1 ELSE -om.ilosc1 END),
lower(a.jm1),
CASE WHEN sum(CASE WHEN om.typ='P' THEN om.ilosc1 ELSE -om.ilosc1 END) <>0 THEN sum(CASE WHEN om.typ='P' THEN om.wartosc ELSE -om.wartosc END)/sum(CASE WHEN om.typ='P' THEN om.ilosc1 ELSE -om.ilosc1 END) ELSE 0 END,
sum(CASE WHEN om.typ='P' THEN om.ilosc2 ELSE -om.ilosc2 END),
lower(a.jm2)
CASE WHEN sum(CASE WHEN om.typ='P' THEN om.ilosc2 ELSE -om.ilosc2 END) <>0 THEN sum(CASE WHEN om.typ='P' THEN om.wartosc ELSE -om.wartosc END)/sum(CASE WHEN om.typ='P' THEN om.ilosc2 ELSE -om.ilosc2 END) ELSE 0 END,
sum(CASE WHEN om.typ='P' THEN om.wartosc ELSE -om.wartosc END)
FROM obroty_magazynowe om INNER JOIN artykuly a ON (om.artykul_id=a.artykul_id) INNER JOIN kateg_artykulow ka ON (a.kateg_artykulu=ka.kod)
WHERE (strpos(om.magazyn_id,ListaMagazynow)>0 or ListaMagazynow='') AND (strpos(a.kateg_artykulu,ListaKategorii)>0 or ListaKategorii='') AND data <=Dzien AND data >=(SELECT data FROM obroty_magazynowe WHERE (strpos(om.magazyn_id,ListaMagazynów)>0 or ListaMagazynow='') AND data <=Dzien AND dokument_id='BO' AND artykul_id=om.artykul_id ORDER BY data DESC LIMIT 1)
GROUP BY (1,2,3,5,8) --numery kolumn--
Pozdrawiam grupę Jan Raburski
Artur Muszynski - 16-05-2006 00:15
=?iso-8859-2?Q?Re:_=5Bpostgresql=5D_Jak_przyspieszy=E6_zapyta nie?=
> WHERE (strpos(om.magazyn_id,ListaMagazynow)>0 or > ListaMagazynow='') AND (strpos(a.kateg_artykulu,ListaKategorii)>0 or > ListaKategorii='')
zacznij od pozbycia się tego
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 16-05-2006 00:15
Jan Raburski wrote: > Witam, > > trzeba policzyć stany magazynowe na dowolny dzień. > parametrami są: ListaMagazynow, ListaKategorii i Dzien > ListaMagazynow=tekst z numerami magazynów rozdzielone '/', np. '01/02' > Jeśli pusty to wszystkie magazyny > ListaKategorii=tekst z numerami kategorii rozdzielone '/', np. 'AB/17' > Jeśli pusty to wszystkie kategorie > tabele: ka-kategorie towarów, a-artykuły, om-obroty magazynowe > indeksy na om wg : artykul_id, data, magazyn_id, dokument_id > typ='P' oznacza przyjęcie, 'W'-wydanie z magazynu > Dodatkowo jeśli występuje dokument o typie 'BO', to należy przyjąć go > jako stan początkowy, pomijając dane z wcześniejszą datą. > > Zapytanie działa, tyle tylko, że na 400 tys wierszy około 10 minut. > Gdzie jest wąskie gardło i co można zmienić, żeby działało szybciej ?
Przekombinowałeś. Jakbyś zamiast '/' użył ',' i zamiast strpos użył operatora IN i zapytanie zbudował dynamicznie, to postgres mógłby użyć indeksu na (magazyn_id,kateg_artykulu), o ile go założyłeś.
Ten subselect też mi się wydaje podejrzany, ale dla niego potrzeba by było więcej danych merytorycznych. Ale jakby udało Ci sie ograniczyć datę od dołu na stałe, to mógłbyś jeszcze datę to indeksu dołożyć.
P.S. Wersja postgresa ma duże znaczenie na szybkość operatora IN.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
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)
mecze sie i mecze i nic - zapytanie czesciowe
[sql][pgsql] zapytanie sql
Postgres - replikcja master-master
zanotowane.pldoc.pisz.plpdf.pisz.plradioaktywni.htw.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 |
|