|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
Есть большой сложный запрос, в плане выполнения у него есть такой фрагмент: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
2) Правильно ли я понимаю, что Materialize размещается в work_mem? И если Materialize в work_mem не влезает, то будет использоваться диск? Дело в том, что исходный work_mem был 20Mb, я предположил что медленная работа с Materialize отчасти объясняется дисковыми операциями - work_mem увеличили до 80Mb, но время выполнения запроса не изменилось. server_version = 9.6.20 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 11:07 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
Вроде, слово Materialize и есть сброс на диск в данном случаи. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 13:29 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
eml78, В actual_time показывается усредненное время по всем итерациям выполнения этой строки плана. Умножайте на значение из loops и получите общее время. В плане есть два места, намекающие на то, что индексы на regpayment0_. по столбцам contractor_id и fundstype_id могли бы помочь. Но без знания деталей, это почти гадание. Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 14:19 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
Павел Лузанов В actual_time показывается усредненное время по всем итерациям выполнения этой строки плана. Умножайте на значение из loops и получите общее время. Спасибо за пояснение. Насчет индексов: в данном случае не требуется оптимизировать конкретный запрос, хочется разобраться с Materialize. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 15:13 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
Guzya Вроде, слово Materialize и есть сброс на диск в данном случаи. Мне казалось, что как раз наоборот. www.postgresql.org/docs/9.6/using-explain.htmlNotice that here the planner has chosen to "materialize" the inner relation of the join, by putting a Materialize plan node atop it. This means that the t2 index scan will be done just once, even though the nested-loop join node needs to read that data ten times, once for each row from the outer relation. The Materialize node saves the data in memory as it's read, and then returns the data from memory on each subsequent pass. Поэтому вопрос про Materialize и work_mem актуален ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 15:26 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
eml78 Guzya Вроде, слово Materialize и есть сброс на диск в данном случаи. Мне казалось, что как раз наоборот. www.postgresql.org/docs/9.6/using-explain.htmlNotice that here the planner has chosen to "materialize" the inner relation of the join, by putting a Materialize plan node atop it. This means that the t2 index scan will be done just once, even though the nested-loop join node needs to read that data ten times, once for each row from the outer relation. The Materialize node saves the data in memory as it's read, and then returns the data from memory on each subsequent pass. Поэтому вопрос про Materialize и work_mem актуален https://github.com/postgres/postgres/blob/REL9_6_STABLE/src/backend/executor/nodeMaterial.c#L61 + https://github.com/postgres/postgres/blob/REL9_6_STABLE/src/backend/utils/sort/tuplestore.c#L19 Использует абстракцию tuplestore, сначала сохраняет в памяти что поместится по объёму work_mem, затем скидывает это на диск в виде временного файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 15:59 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
eml78, На каждый узел плана (включая materialize) выделяется память в пределах work_mem. Если не хватает - данные сбрасываются на диск. Есть исключения, но в целом так. Не факт, что запрос упирается в work_mem. Добавьте в explain к analyze еще buffers. Станет яснее. Но в примере проблема не в медленном materialize, а в неправильной оценке кардинальности, начиная с самой нижней строки плана. Эта ошибка приводит к тому, что в первой строке (и еще раз в середине плана) для соединения используется nested loops, хотя этот метод в обоих случаях неудачен. Вот и получается, что materialize гоняется в цикле тысячи раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 16:16 |
|
Materialize в плане запроса
|
|||
---|---|---|---|
#18+
Павел Лузанов Но в примере проблема не в медленном materialize, а в неправильной оценке кардинальности Да, я в курсе, и в принципе даже известно как это поправить. Просто хотел для себя разобраться с materialize. Спасибо, за ответы по work_mem - там судя по всему один materialize = 40Mb, а второй 80Mb - сейчас в темпе оказывается тот что на 80Мб. Видимо оба одновременно должно в память влезть чтобы быстро было... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2021, 16:35 |
|
|
start [/forum/topic.php?fid=53&gotonew=1&tid=1993768]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 249ms |
total: | 380ms |
0 / 0 |