|
|
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Работаю с таким запросом: 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. Проблема явно связана с этим 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 вместо обоих? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 10:03 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, У вас одни Hash Join'ы разного типа, и большое кол-во отфильтрованных записей. А какие индексы имеются на таблицах из этого запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 10:10 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Похоже проблема в огромном количестве Batches: Buckets: 4096 Batches: 1048576 (originally 16) Memory Usage: 1724kB Но откуда их столько загадка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 10:15 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
vyegorovNitro_Junkie, У вас одни Hash Join'ы разного типа, и большое кол-во отфильтрованных записей. А какие индексы имеются на таблицах из этого запроса? Индексы на ключах. Но даже если их добавить вряд ли их имеет смысл использовать, так как количество отфильтрованных записей соизмеримо с количеством результирующих записей (а не на порядки больше)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 10:17 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Хотя все, разобрался, work_mem по умолчанию стоял всего 1MB :(, ей приходится тучу batches делать, сохраняя на диск. Вопрос правда в другом, а есть какая-нить возможность для запросов с большим количеством данных увеличивать work_mem? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 10:39 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Параметр `work_mem` может быть заменен в рамках каждой сессии: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 11:49 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
vyegorovNitro_Junkie, Параметр `work_mem` может быть заменен в рамках каждой сессии: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 12:06 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, буду пробовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 12:27 |
|
||
|
Неприлично долгий HASH RIGHT JOIN
|
|||
|---|---|---|---|
|
#18+
(в частности там идет SELF LEFT JOIN по ключам что не имеет смысла) ну дык выкинь его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 13:22 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38875466&tid=1998185]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
202ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 523ms |

| 0 / 0 |
