powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Неприлично долгий HASH RIGHT JOIN
10 сообщений из 10, страница 1 из 1
Неприлично долгий HASH RIGHT JOIN
    #38875466
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю с таким запросом:

EXPLAIN ANALYZE SELECT SUM(1)
FROM (

(SELECT t0.key0 AS jkey0,
CASE WHEN t2.System__CLASS_Inventory_inventorySkuDetail=70 THEN (((-(t1.Inventory_quantityShortageCollationSheetSku_null_null)))) WHEN t3.System__CLASS_ZReport_receiptReturnDetail=29 THEN t3.ZReport_quantityReceiptReturnDetail_ReceiptReturnDetail WHEN t5.System__CLASS_Inventory_inventoryBatchDetail=109 THEN (((-(t4.Inventory_quantityShortageCollationSheetBatch_null_null)))) WHEN t7.System__CLASS_Stock_skuLedger=279 THEN t6.Purchase_quantityShipmentDetail_ShipmentDetail WHEN (t9.System__CLASS_PurchaseSaleReturnShipment_saleReturnShipmentDeta=8045288
OR t10.System__CLASS_SaleReturn_invoiceShipmentDetail=142
OR t11.System__CLASS_SaleReturn_userShipmentDetail=298) THEN t8.SaleReturn_quantityShipmentDetail_ShipmentDetail ELSE NULL END AS jprop0
FROM Stock_skuLedger t0
LEFT JOIN Inventory_inventorySkuDetail t2 ON t2.key0=t0.key0
LEFT JOIN Inventory_collationSheetSku t1 ON t1.key0=t2.Inventory_collationSheetInInventorySkuDetail_InInventorySkuDeta
AND t1.key1=t2.Inventory_skuInInventorySkuDetail_InInventorySkuDetail
LEFT JOIN ZReport_receiptReturnDetail t3 ON t3.key0=t0.key0
LEFT JOIN Inventory_inventoryBatchDetail t5 ON t5.key0=t0.key0
LEFT JOIN Inventory_collationSheetBatch t4 ON t4.key1=t5.Inventory_batchInInventoryBatchDetail_InInventoryBatchDetail
AND t4.key0=t5.Inventory_collationSheetInInventoryBatchDetail_InInventoryBatch
LEFT JOIN Stock_skuLedger t7 ON t7.key0=t0.key0
LEFT JOIN Purchase_shipmentDetail t6 ON t6.key0=t7.Purchase_shipmentDetailShipmentSkuLedger_ShipmentSkuLedger
LEFT JOIN SaleReturn_shipmentDetail t8 ON t8.key0=t0.key0
LEFT JOIN PurchaseSaleReturnShipment_saleReturnShipmentDetail t9 ON t9.key0=t0.key0
LEFT JOIN SaleReturn_invoiceShipmentDetail t10 ON t10.key0=t0.key0
LEFT JOIN SaleReturn_userShipmentDetail t11 ON t11.key0=t0.key0
WHERE (((((-(t1.Inventory_quantityShortageCollationSheetSku_null_null)))) IS NULL
OR NOT t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger=(((-(t1.Inventory_quantityShortageCollationSheetSku_null_null)))))
AND (t3.ZReport_quantityReceiptReturnDetail_ReceiptReturnDetail IS NULL
OR NOT t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger=t3.ZReport_quantityReceiptReturnDetail_ReceiptReturnDetail)
AND ((((-(t4.Inventory_quantityShortageCollationSheetBatch_null_null)))) IS NULL
OR NOT t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger=(((-(t4.Inventory_quantityShortageCollationSheetBatch_null_null)))))
AND (t6.Purchase_quantityShipmentDetail_ShipmentDetail IS NULL
OR NOT t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger=t6.Purchase_quantityShipmentDetail_ShipmentDetail)
AND (t8.SaleReturn_quantityShipmentDetail_ShipmentDetail IS NULL
OR NOT t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger=t8.SaleReturn_quantityShipmentDetail_ShipmentDetail)
AND t0.Stock_quantityInLIFOSkuLedger_InLIFOSkuLedger IS NOT NULL))
) UALIAS GROUP BY 2+3

Он мягко говоря не очень красивый (в частности там идет SELF LEFT JOIN по ключам что не имеет смысла), но по неизвестной причине он очень долго выполняется:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
"GroupAggregate  (cost=219422.30..246875.52 rows=1 width=0) (actual time=7323699.293..7323699.293 rows=0 loops=1)"
"  ->  Hash Left Join  (cost=219422.30..245410.02 rows=293098 width=0) (actual time=7323699.292..7323699.292 rows=0 loops=1)"
"        Hash Cond: (t0.key0 = t8.key0)"
"        Filter: ((t8.salereturn_quantityshipmentdetail_shipmentdetail IS NULL) OR (t0.stock_quantityinlifoskuledger_inlifoskuledger <> t8.salereturn_quantityshipmentdetail_shipmentdetail))"
"        Rows Removed by Filter: 15440"
"        ->  Hash Left Join  (cost=218836.87..241020.47 rows=301520 width=8) (actual time=55145.155..7323679.552 rows=15440 loops=1)"
"              Hash Cond: (t0.key0 = t5.key0)"
"              Filter: (((- t4.inventory_quantityshortagecollationsheetbatch_null_null) IS NULL) OR (t0.stock_quantityinlifoskuledger_inlifoskuledger <> (- t4.inventory_quantityshortagecollationsheetbatch_null_null)))"
"              ->  Hash Left Join  (cost=213856.39..234524.75 rows=301809 width=8) (actual time=55095.447..7323625.382 rows=15440 loops=1)"
"                    Hash Cond: (t0.key0 = t2.key0)"
"                    Filter: (((- t1.inventory_quantityshortagecollationsheetsku_null_null) IS NULL) OR (t0.stock_quantityinlifoskuledger_inlifoskuledger <> (- t1.inventory_quantityshortagecollationsheetsku_null_null)))"
"                    ->  Hash Left Join  (cost=212112.20..231645.33 rows=302100 width=8) (actual time=55095.426..7323623.349 rows=15440 loops=1)"
"                          Hash Cond: (t0.key0 = t3.key0)"
"                          Filter: ((t3.zreport_quantityreceiptreturndetail_receiptreturndetail IS NULL) OR (t0.stock_quantityinlifoskuledger_inlifoskuledger <> t3.zreport_quantityreceiptreturndetail_receiptreturndetail))"
"                          Rows Removed by Filter: 27611"
"(!!!!!)                  ->  Hash Right Join  (cost=210986.96..225899.27 rows=314295 width=8) (actual time=55082.482..7323508.306 rows=43051 loops=1)"
"                                Hash Cond: (t6.key0 = t7.purchase_shipmentdetailshipmentskuledger_shipmentskuledger)"
"                                Filter: ((t6.purchase_quantityshipmentdetail_shipmentdetail IS NULL) OR (t0.stock_quantityinlifoskuledger_inlifoskuledger <> t6.purchase_quantityshipmentdetail_shipmentdetail))"
"                                Rows Removed by Filter: 268717"
"                                ->  Seq Scan on purchase_shipmentdetail t6  (cost=0.00..9007.03 rows=362603 width=8) (actual time=0.007..266.315 rows=362603 loops=1)"
"                                ->  Hash  (cost=205421.33..205421.33 rows=320130 width=12) (actual time=15002.664..15002.664 rows=311768 loops=1)"
"                                      Buckets: 4096  Batches: 1048576 (originally 16)  Memory Usage: 1724kB"
"                                      ->  Hash Right Join  (cost=89388.51..205421.33 rows=320130 width=12) (actual time=343.890..1521.451 rows=311768 loops=1)"
"                                            Hash Cond: (t7.key0 = t0.key0)"
"                                            ->  Seq Scan on stock_skuledger t7  (cost=0.00..84135.88 rows=1656988 width=8) (actual time=0.013..327.018 rows=1657069 loops=1)"
"                                            ->  Hash  (cost=84135.88..84135.88 rows=320130 width=8) (actual time=340.774..340.774 rows=311768 loops=1)"
"                                                  Buckets: 4096  Batches: 16  Memory Usage: 787kB"
"                                                  ->  Seq Scan on stock_skuledger t0  (cost=0.00..84135.88 rows=320130 width=8) (actual time=0.090..298.154 rows=311768 loops=1)"
"                                                        Filter: (stock_quantityinlifoskuledger_inlifoskuledger IS NOT NULL)"
"                                                        Rows Removed by Filter: 1345301"
"                          ->  Hash  (cost=645.11..645.11 rows=27611 width=9) (actual time=11.525..11.525 rows=27611 loops=1)"
"                                Buckets: 4096  Batches: 2  Memory Usage: 559kB"
"                                ->  Seq Scan on zreport_receiptreturndetail t3  (cost=0.00..645.11 rows=27611 width=9) (actual time=0.005..6.069 rows=27611 loops=1)"
"                    ->  Hash  (cost=1734.94..1734.94 rows=740 width=9) (actual time=0.001..0.001 rows=0 loops=1)"
"                          Buckets: 1024  Batches: 1  Memory Usage: 0kB"
"                          ->  Hash Left Join  (cost=1478.43..1734.94 rows=740 width=9) (actual time=0.001..0.001 rows=0 loops=1)"
"                                Hash Cond: ((t2.inventory_collationsheetininventoryskudetail_ininventoryskudeta = t1.key0) AND (t2.inventory_skuininventoryskudetail_ininventoryskudetail = t1.key1))"
"                                ->  Seq Scan on inventory_inventoryskudetail t2  (cost=0.00..17.40 rows=740 width=12) (actual time=0.001..0.001 rows=0 loops=1)"
"                                ->  Hash  (cost=690.17..690.17 rows=39617 width=13) (never executed)"
"                                      ->  Seq Scan on inventory_collationsheetsku t1  (cost=0.00..690.17 rows=39617 width=13) (never executed)"
"              ->  Hash  (cost=4956.17..4956.17 rows=1945 width=9) (actual time=49.694..49.694 rows=1945 loops=1)"
"                    Buckets: 1024  Batches: 1  Memory Usage: 69kB"
"                    ->  Hash Left Join  (cost=4185.70..4956.17 rows=1945 width=9) (actual time=44.507..49.212 rows=1945 loops=1)"
"                          Hash Cond: ((t5.inventory_batchininventorybatchdetail_ininventorybatchdetail = t4.key1) AND (t5.inventory_collationsheetininventorybatchdetail_ininventorybatch = t4.key0))"
"                          ->  Seq Scan on inventory_inventorybatchdetail t5  (cost=0.00..42.45 rows=1945 width=12) (actual time=0.004..0.857 rows=1945 loops=1)"
"                          ->  Hash  (cost=1878.28..1878.28 rows=116028 width=13) (actual time=44.442..44.442 rows=116028 loops=1)"
"                                Buckets: 4096  Batches: 8  Memory Usage: 566kB"
"                                ->  Seq Scan on inventory_collationsheetbatch t4  (cost=0.00..1878.28 rows=116028 width=13) (actual time=0.004..21.937 rows=116028 loops=1)"
"        ->  Hash  (cost=392.41..392.41 rows=15441 width=9) (actual time=4.570..4.570 rows=15441 loops=1)"
"              Buckets: 2048  Batches: 1  Memory Usage: 619kB"
"              ->  Seq Scan on salereturn_shipmentdetail t8  (cost=0.00..392.41 rows=15441 width=9) (actual time=0.005..2.301 rows=15441 loops=1)"
"Total runtime: 7323712.689 ms"



Проблема явно связана с этим SELF LEFT JOIN (без него запрос выполняется за 3 секунды), но я все равно не могу понять откуда такой дико долгий HASH RIGHT JOIN. Rows removed всего 268717 при общем результате 45000. То есть общий результат Hash Join меньше 350к, что для СУБД семечки.

PS: Если Self Left Join убрать то ни одного Hash Right Join'а не будет.
PS2: Я правильно понимаю что Hash Right Join отличается от Hash Left Join только тем что фильтруется правый join вместо левого, а от Hash Inner Join тем что фильтруется правый join вместо обоих?
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875480
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

У вас одни Hash Join'ы разного типа, и большое кол-во отфильтрованных записей.
А какие индексы имеются на таблицах из этого запроса?
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875489
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

Похоже проблема в огромном количестве Batches:

Buckets: 4096 Batches: 1048576 (originally 16) Memory Usage: 1724kB

Но откуда их столько загадка...
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875492
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovNitro_Junkie,

У вас одни Hash Join'ы разного типа, и большое кол-во отфильтрованных записей.
А какие индексы имеются на таблицах из этого запроса?

Индексы на ключах. Но даже если их добавить вряд ли их имеет смысл использовать, так как количество отфильтрованных записей соизмеримо с количеством результирующих записей (а не на порядки больше)...
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875534
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

Хотя все, разобрался, work_mem по умолчанию стоял всего 1MB :(, ей приходится тучу batches делать, сохраняя на диск.

Вопрос правда в другом, а есть какая-нить возможность для запросов с большим количеством данных увеличивать work_mem?
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875668
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitro_Junkie,

Параметр `work_mem` может быть заменен в рамках каждой сессии:
Код: sql
1.
2.
SET work_mem TO '16MB'; -- на всю сессию
SELECT set_config('work_mem', '16MB', true); -- на текущую транзакцию
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875708
неохвачен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovNitro_Junkie,

Параметр `work_mem` может быть заменен в рамках каждой сессии:
Код: sql
1.
2.
3.
4.
SET work_mem TO '16MB'; -- на всю сессию
SET LOCAL  -- тащемто
SELECT set_config('work_mem', '16MB', true); -- на текущую транзакцию
ALTER FUNCTION ..... SET -- на функцию
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875757
Nitro_Junkie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, буду пробовать...
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875856
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(в частности там идет SELF LEFT JOIN по ключам что не имеет смысла)

ну дык выкинь его
...
Рейтинг: 0 / 0
Неприлично долгий HASH RIGHT JOIN
    #38875873
кхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durak(в частности там идет SELF LEFT JOIN по ключам что не имеет смысла)

ну дык выкинь егодак наверное не афтар генерит сей креатив.
а поломать чудо--генерилку -- жалко.
у пчолке.
в где.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Неприлично долгий HASH RIGHT JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]