|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Всем привет. Есть некая sql функция - там простой селект с группировкой. Код: plsql 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Все отлично - cardinality estimation правильное, везде где надо index scan. Если джойнить эту функцию с таблицей, по которой ожидается небольшое кол-во строк (index scan), то происходит fullscan с hash join, хотя ожидается везде index scan с nested loop: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Код: plaintext 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.
Пробовал через lateral, но все равно - план такой же как и при обычном джойне: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 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.
Что делать то ? Ведущей таблицей в плане должна быть PE.FD_Debts_Transfers_Documents с небольшим кол-вом искомых строк (в плане кстати cardinality estimation для нее правильный) + должен быть nested loop c запросом из PE.FF_Payments_Balance(). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 08:42 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Cristiano_Rivaldo, У функции какие-нибудь атрибуты объявлены?? Ну там STABLE, например. Какими-нибудь подсказками оптимизатору уже игрались?? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:23 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Cristiano_Rivaldo, покажите explain для варианта где вместо PE.FF_Payments_Balance() подставлен ваш select ("простой селект с группировкой") попробуем понять проблема в функции или проблема в финальном запросе который после inline получается. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2020, 19:40 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Функция объявлена как stable. Но смысл скорее всего не в этом. Потому что план с подставленным запросом(вместо функции) такой же : Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 08:14 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Ну почти такой же ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 08:15 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
На всякий случай : Код: plsql 1. 2. 3. 4. 5.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 08:42 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
На форуме оказывается уже был подобный топик - Отсутствие JPPD оптимизации как класса ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 08:57 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Cristiano_Rivaldo Функция объявлена как stable. Но смысл скорее всего не в этом. Потому что план с подставленным запросом(вместо функции) такой же : как в общем и ожидалось... что можно посоветовать сделать я бы сделал функцию PE.FF_Payments_Balance(division, link) и использовал бы ее с lateral join в этой задаче. фактически ручной "Join Predicate Push Down" организовал бы. Кстати не то чтобы его нет в вашем случае... потому что константы (f_division = 1) или 39438381 = D.LINK - база уже умеет пробрасывать... а вот в joins с полями - нет судя по всему. А на всякий случай попробуйте сделать explain запроса перед этим выполнив set enable_seq_scan to 0; set enable_hashjoin to 0; и потом explain (стоит проверить теорию что jppd не срабатывает потому что оценка стоимости неверная). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 09:24 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Maxim Boguk, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 10:26 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Cristiano_Rivaldo, угу... тогда скорее всего только ручной push down через создание функции с параметрами и пробросом их внутрь запроса явно. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 10:39 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Maxim Boguk, Являетесь ли вы коммитером ? Можете написать об этой проблеме куда надо ? Я считаю что проблема очень актуальная... Кучу кода нужно будет переписывать и переосмысливать. Особенно это ждет тех,кто занимается переносом кода(архитектуры) с MS SQL или Oracle. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 10:45 |
|
Join Predicate Push Down отсутствует ? И что делать ?
|
|||
---|---|---|---|
#18+
Cristiano_Rivaldo Maxim Boguk, Являетесь ли вы коммитером ? Можете написать об этой проблеме куда надо ? Я считаю что проблема очень актуальная... Кучу кода нужно будет переписывать и переосмысливать. Особенно это ждет тех,кто занимается переносом кода(архитектуры) с MS SQL или Oracle. Не являюсь, но достаточно близок к разработке PostgreSQL чтобы сказать что ответ будет "patches welcome" или предложение проспонсировать разработку требуемой вам функциональности... и года через 2-3 - может будет в production версии (15 или 16). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 11:39 |
|
|
start [/forum/topic.php?fid=53&msg=39999218&tid=1994470]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 263ms |
0 / 0 |