|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
Заметил такую особенность. Есть план выполнения запроса, в котором видно, что доступ к данным осуществляется с использованием составного индекса. Увеличил значение work_mem. План изменился. Теперь выполняется сканирование таблицы с последующей фильтрацией по одному полю из составного индекса. Индекс не используется. Время выполнения запроса снизилось на порядок. Как это можно объяснить? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 08:56 |
|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
big-trotЗаметил такую особенность. Есть план выполнения запроса, в котором видно, что доступ к данным осуществляется с использованием составного индекса. Увеличил значение work_mem. План изменился. Теперь выполняется сканирование таблицы с последующей фильтрацией по одному полю из составного индекса. Индекс не используется. Время выполнения запроса снизилось на порядок. Как это можно объяснить? Вряд ли это результат изменения именно work_mem. Покажите explain с разными значениями work_mem для начала. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 09:08 |
|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
Maxim Boguk, План выполнения с work_mem=32MB Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
План выполнения с увеличенным work_mem='2GB' Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 10:13 |
|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
big-trot, Код: sql 1. 2. 3.
вот эту часть надо попробовать исправить (где 11 строк), возможно оценка n_distinct для id_hash1 кривая. см. вывод Код: sql 1. 2.
влияние work_mem на план запроса объясняется легко: для hash join нужна память, которой было недостаточно в первом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 10:31 |
|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
big-trot, У вас очень плохая оценка селективности условия (на порядок) и похоже высокий random_page_cost (id_hash1 = ANY ('{32d48e1a87c1ca3117532e0af9fbbc82ebc6a890,***,ccad72e1e94abdf8e83470e5e0ee96be787fae43}'::bpchar[]))) (cost=1.05..14607.12 rows= 4409 width=82) (actual time=0.055..5.876 rows= 398 loops=1) так что удачный план при низком work_mem это просто везение. Рекомендации две 1)посмотреть что у вас стоит в random_page_cost, учитывая что по вашим планам там получается все с памяти читается - там должно быть тоже самое что в seq_page_cost или на 10% выше максимум а не 4:1 по умолчанию 2)посмотреть что у вас стоит в default_statistics_target и скорее всего поднять его для obj_link_param(id_hash) через alter table obj_link_param alter id_hash set statistics 1000; analyze obj_link_param; (возможно даже 10000). После 2 - приведите что показывает explain analyze select distinct id_hash from obj_link_param; чтобы понять насколько лучше планировщик стал селективность оценивать (и не стоит ли руками n_distinct прописать для obj_link_param(id_hash)). -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 10:37 |
|
Увеличение work_mem приводит к неоптимальному плану
|
|||
---|---|---|---|
#18+
Maxim BogukРекомендации две 1)посмотреть что у вас стоит в random_page_cost, учитывая что по вашим планам там получается все с памяти читается - там должно быть тоже самое что в seq_page_cost или на 10% выше максимум а не 4:1 по умолчанию Помогла эта рекомендация. Спасибо Maxim BogukПосле 2 - приведите что показывает Показываю Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2018, 11:09 |
|
|
start [/forum/topic.php?fid=53&msg=39656211&tid=1995740]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 298ms |
total: | 443ms |
0 / 0 |