konto usunięte

Temat: Postgresql - dziwne zapętlenie

Witam,

czy spotkaliście się z taką sytuacją, że normalnie wykonujące sie zapytanie po zmianie parametru w warunku nagle przestalo się wykonywać i trwa..i trwa..i trwa?

Mam taką sytuacje ze jest zapytanie z agregacją danych (zliczanie) i kilkoma warunkami w where i jak wybieram przedzial czasu za np 2 miesiace (styczen-luty) to robi sie normalnie i jest ok
Jak zrobie sam styczen to 1,5 s
jak styczen + luty to 3 s
jak dodam marzec..do 10.03 to tam ok 4 se
ale jak juz dam do 14.03 ;) to koniec...
ale jak zrobie sam marzec to juz znowu jest OK i 1,5 s.
dopiero jak zakomentowalem fragment pewnego warunku to zaczelo dzialac..(dziwne bo przeciez na innym zakresie danych dzialal OK).. ale w teorii nie powinno miec wplywu bo danych w ten jeden dzien tak wiele nie przybylo... sa indeksy, zreszta podobne zapytanie albo wręcz identyczne, tylko np bez grupowania itd..dzialaja poprawnie..


select
i.lok_id,cv2.id,count(it.id) as ile
from
knf.inv_header i
left join knf.inv_item it ON (it.header_id = i.id)
left join knf.order_item oi ON (it.id=oi.inv_item_id)
left join knf.order_itmtype oit ON (oit.it_id=oi.itemtype_id)
LEFT JOIN knf.order_item oi2 on (oi.id = oi2.id-1 AND (oi2.itemtype_id in (select unnest(knf.get_category_ids('REP_TAX')))) AND oi.header_id = oi2.header_id AND oi.order_package_posnumber=oi2.order_package_posnumber)
LEFT JOIN knf.inv_item it2 ON (it2.id=oi2.inv_item_id)
left JOIN
(
select distinct oi.inv_item_id,header_id,order_package_posnumber from knf.order_item oi
left join knf.order_itmtype oit ON (oit.it_id=oi.itemtype_id)
where oit.itemtypetype_id = 3
AND oi.itemtype_id in (select unnest(knf.get_category_ids('REP_FEE_LOT')))
) as oi3 ON (oi.header_id = oi3.header_id and oi.order_package_posnumber = oi3.order_package_posnumber and oit.itemtypetype_id in (1,4))
LEFT JOIN knf.inv_item it3 ON (it3.id = oi3.inv_item_id)
left join knf.knf_customer_v2 cv2 ON (i.customer_id = cv2.id)
where
i.istate_id <> 2
and it.itemtype_id is not null
and
(it.itemtype_id in (select unnest(knf.get_category_ids('REP_LOT_PROD'))))
AND CAST(i.idate AS date) >= CAST('2013-01-01' AS date)
AND CAST(i.idate AS date) <= CAST('2013-03-10' AS date) --tu jak zmienie datę na 03-31 to kaplica..
AND (it.brutto + coalesce(it2.brutto,0)) >=0.00
AND CASE WHEN
i.itype = 'FK' THEN
(it.brutto
+coalesce(it2.brutto,0) --jesli to zakomentuje przy dacie do ..03-31 to jest ok
+coalesce(it3.brutto,0) --jesli to zakomentuje przy dacie do ..03-31 to jest ok
) <> 0
ELSE true END
GROUP BY i.lok_id,cv2.id


jakiś pomysł ? Już abstrahując od tego czy to zapytanie jest optymalne czy nie ;)Wojtek Stępień edytował(a) ten post dnia 25.04.13 o godzinie 01:18

konto usunięte

Temat: Postgresql - dziwne zapętlenie

Zapewne występuje scenariusz typu: przy odpowiednio szerokim przedziale czasowym optymalizator decyduje się na full scan zamiast użycia indeksu.

Sprawdź plany tych wszystkich zapytań.

konto usunięte

Temat: Postgresql - dziwne zapętlenie

kurcze no po odkomentowaniu tego +coalesce(it2..brutto,0) plan jest zupelnie inny...:(( co za lipa.
I co w takiej sytuacji ?

konto usunięte

Temat: Postgresql - dziwne zapętlenie

hehe próbowałem ten warunek z tą sumą zapisac inaczej :) ale nie dal sie oszukać..

Temat: Postgresql - dziwne zapętlenie

Czy it.brutto, it2.brutto, it3.brutto to nie ta sama wartość ?
Dlaczego jest założenie, że it.brutto nie może być null, a it2.brutto, it3.brutto mogą ?
Czy wartość it.brutto([ 23]) jest zawsze nieujemna lub null ?

(it.brutto
+coalesce(it2.brutto,0) --jesli to zakomentuje przy dacie do ..03-31 to jest ok
+coalesce(it3.brutto,0) --jesli to zakomentuje przy dacie do ..03-31 to jest ok
) <> 0
jest rownoważne
(it.brutto > 0) or (coalesce(it2.brutto,0) > 0) or (coalesce(it3.brutto,0) > 0)


Ile rekordów produkuje zapytanie sql przed "group by" ?
Można przerobić to na procedurę składowaną, przykładowa korzyść redukcja wywołań trzykrotnego "(select unnest(knf.get_category_ids('REP_LOT_PROD')))"

konto usunięte

Temat: Postgresql - dziwne zapętlenie

1) Uaktualnij statystyki
2) Pokaż plan.

konto usunięte

Temat: Postgresql - dziwne zapętlenie

później chętnie o tym podyskutuję.. teraz trochę nie mam czasu :/

it.brutto, it2.brutto, it3.brutto to nie ta sama wartość

Dlaczego jest założenie, że it.brutto nie może być null, a it2.brutto, it3.brutto mogą ?
bo it.brutto to brutto z pozycji faktury, it2.brutto i it3.brutto maja reprezentowac kwote z faktury..ale jesli by nie byly zafakturowane te pozycje w zamowieniu..(oi...) to mogą byc null.

aha i ten unnest to nie jest 3 razy to samo :) tylko to są 3 inne zbiory danychWojtek Stępień edytował(a) ten post dnia 25.04.13 o godzinie 16:33
Łukasz Dudek

Łukasz Dudek Database
Administrator

Temat: Postgresql - dziwne zapętlenie

raczej chodzi o brak partycjonowania poziomego na (knf.inv_header i) a używanie "CAST(i.idate AS date)" (nie wiem planu nie widze wiec mogę się mylić) świadczy o nie wiedzy w używaniu indeksów.

konto usunięte

Temat: Postgresql - dziwne zapętlenie

zapewniam ze to nie jest problem tabeli inv_header a ten cast jest z rozpędu w sumie, nie potrzebny choć kolumna idate jest typu timestamp

konto usunięte

Temat: Postgresql - dziwne zapętlenie

rozbij to zapytanie na składowe i jak Bozia przykazała użyj CTE
http://www.postgresql.org/docs/9.1/static/queries-with...

to co tu pokazujesz to potworek pod względem wydajności
np. select unnest(knf.get_category_ids('REP_LOT_PROD')
masz w dwu miejscach
coalesce(it3.brutto,0)
to mógł byś wyciągnąć do podzapytania w CTE i był by spokój
Łukasz Dudek

Łukasz Dudek Database
Administrator

Temat: Postgresql - dziwne zapętlenie

Przemysław R.:
rozbij to zapytanie na składowe i jak Bozia przykazała użyj CTE
http://www.postgresql.org/docs/9.1/static/queries-with...

to co tu pokazujesz to potworek pod względem wydajności
np. select unnest(knf.get_category_ids('REP_LOT_PROD')
masz w dwu miejscach
coalesce(it3.brutto,0)
to mógł byś wyciągnąć do podzapytania w CTE i był by spokój
CTE jest głównie dla czytelności kodu...
coalesce(it3.brutto,0) czy coalesce(it2.brutto,0)

konto usunięte

Temat: Postgresql - dziwne zapętlenie

Po pierwsze dziękuję za odpowiezi :)
Po drugie już załatwiona sprawa, zmieniłem troche kolejność złączen i usunalem tego nieszczęsnego CASTA i wyrzuclem zbędne tabele i działa OK.
Także Łukasz Dudek dzięki :) reszta zresztą też.

nie wiem czemu każdy widzi tu jakieś REP_LOT_PROD w dwóch miejscach albo nawet w trzech miejscach jak jest w jednym :) każðy z tych selectów zwraca co innego.

to czy to jest mało wydajne itd to pozostawmy już w spokoju, niestety struktura bazy danych nie zawsze pozwala na super książkowe rozwiązanie i spełnienie zachcianek klienta a rada w stylu "to trzeba zrobić tak , żeby spełniała" też w praktyce okazuje się czasami tylko marzeniem.

Następna dyskusja:

[PostgreSQL] Dziwne zachowa...




Wyślij zaproszenie do