|
запросы в цикле и plan_cache_mode
|
|||
---|---|---|---|
#18+
добрый день. наткнулся на фичу при кешировании планов запросов в пгскл. подготовка данных: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
выполняем блок1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
результат: Код: plaintext 1.
выполняем блок2 через динамический скл: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
результат: Код: plaintext 1.
это ожидаемо и понятно. делаем данные более похожими на реальные: Код: sql 1. 2. 3. 4. 5. 6.
выполняем блок1: Код: plaintext 1.
выполняем блок2: Код: plaintext 1.
не понимаем и лопатим доку: докаПо умолчанию (то есть когда plan_cache_mode имеет значение auto), сервер автоматически выбирает, использовать ли для подготовленного оператора с параметрами общий или специализированный план. На данный момент это происходит по следующему принципу — первые пять выполнений производятся со специализированными планами и вычисляется средняя стоимость этих планов. Затем строится общий план и его примерная стоимость сравнивается со средней стоимостью специализированных. При последующих выполнениях общий план будет использоваться, если его стоимость, по сравнению со стоимостью специализированных, не настолько велика, чтобы оправдать повторное планирование. смотрим настройки: Код: plaintext 1. 2. 3.
пробуем поколдовать: Код: plaintext 1. 2. 3.
еще раз выполняем блок1: Код: plaintext 1.
выполняем блок2: Код: plaintext 1.
не понятны 2 вещи: 1. почему сервер так сильно ошибается при выборе использования плана (пробовал формировать данные чтобы первые 5 запросов выполнялись на смешанных данных - результат при plan_cache_mode=auto не меняется) 2. получается в последнем тесте динамический скл не несет видимых накладных расходов? ЗЫ. вот планы которые используются для этого запроса при разных параметрах: Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
и на всякий версия: PostgreSQL 12.7 (Debian 12.7-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 14:12 |
|
запросы в цикле и plan_cache_mode
|
|||
---|---|---|---|
#18+
Misha111, Если у вас в процессе работы хранимки сильно меняется содержимое таблицы то закешированный custom plan может по мере работы стать сильно менее эффективным что у вас и наблюдается. И даже autovacuum тут вас не спасет потому что все в пределах одной транзакции делается. Сама по себе идея в цикле так поступать с таблицей не делая промежуточных commits - она является паталогической для базы. Более того тоже самое может и с custom планом произойти легко. В данном случае просто получилось что custom plan в этой ситуации не деградирует (это скорее случайность при такой задаче). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 14:50 |
|
запросы в цикле и plan_cache_mode
|
|||
---|---|---|---|
#18+
Maxim Boguk, Maxim BogukЕсли у вас в процессе работы хранимки сильно меняется содержимое таблицы то закешированный custom plan может по мере работы стать сильно менее эффективным что у вас и наблюдается. тесткейс собран на коленке дабы отразить суть. в нем данные вообще не удаляются (фильтр f1=1, а в таблице все f1=0) в оригинале есть таблица-назначение из которой удаляются записи которых нет в другой таблице, но при этом старшая часть ключей в источнике есть: delete from t_dst a where key1 in (select key1 from t_src) and (key1, key2) not in (select key1, key2 from t_src) решил проверить скорость если все делать в цикле по старшей части ключа key1 (опять же в примере выше запросы сильно упрощены). т.о. проблема не в изменении данных в цикле, а именно в том что оптимизатор ошибается при выборе плана выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2021, 15:35 |
|
|
start [/forum/topic.php?fid=53&msg=40071663&tid=1994028]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 150ms |
0 / 0 |