ďťż
 
[postgresql] Jak =?ISO-8859-2?Q?przyspieszy=E6_zapytanie?= ďťż
 
[postgresql] Jak =?ISO-8859-2?Q?przyspieszy=E6_zapytanie?=
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • radioaktywni.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com