|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Привет ребята. Подскажите пожалуйста приемы отладки такого примера. Есть функция CREATE FUNCTION db1.get_list( par1 text, par2 text, par3 text, par4 text, par5 text) RETURNS TABLE(column1 int4, column2 int4, column3 int4, column4 int4,) LANGUAGE sql AS $$ Select column1, column2, column3, column4 from main_table mt where mt.c1 = par1 and mt.c2 = par2 or mt.c3 = par3 ... $$ ; Я запускаю select * from get_list(1,2,3,4,5); Какие есть способы, чтоб мне увидеть реальный итоговый запрос, в который все параметры подставлены? Можно ли его как то внутри функции хотя бы запихнуть в raise notice? Или не знаю в логе каком то посмотреть с целью увидеть реальный план? Заранее спасибо. Можно конечно переписать функцию на pgsql, динамически собрать запрос и вывести raise notice, а потом выполнить сам запрос. Но может что то есть сподручнее ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 11:17 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff Какие есть способы, чтоб мне увидеть реальный итоговый запрос, в который все параметры подставлены? Можно ли его как то внутри функции хотя бы запихнуть в raise notice? Или не знаю в логе каком то посмотреть с целью увидеть реальный план? Для тестирования можно подключить auto_explain и выставить auto_explain.log_min_duration = 0; auto_explain.log_nested_statements = on; Тогда в логе увидите и запрос, и план. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 11:26 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Павел Лузанов kliff Какие есть способы, чтоб мне увидеть реальный итоговый запрос, в который все параметры подставлены? Можно ли его как то внутри функции хотя бы запихнуть в raise notice? Или не знаю в логе каком то посмотреть с целью увидеть реальный план? Для тестирования можно подключить auto_explain и выставить auto_explain.log_min_duration = 0; auto_explain.log_nested_statements = on; Тогда в логе увидите и запрос, и план. Позволю себе дополнить(мои настройки) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
А так - да, эта штука реально выручает. А план потом можно прогнать через анализатор, например https://explain.tensor.ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 11:36 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Спасибо большое ребят, буду пробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 11:44 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Павел Лузанов kliff Какие есть способы, чтоб мне увидеть реальный итоговый запрос, в который все параметры подставлены? Можно ли его как то внутри функции хотя бы запихнуть в raise notice? Или не знаю в логе каком то посмотреть с целью увидеть реальный план? Для тестирования можно подключить auto_explain и выставить auto_explain.log_min_duration = 0; auto_explain.log_nested_statements = on; Тогда в логе увидите и запрос, и план. не получается заюзать. Захожу в dbeaver под суперюзером postgres выполняю LOAD 'auto_explain'; SET auto_explain.log_min_duration= "0"; SET auto_explain.log_analyze= "true"; SET auto_explain.log_buffers= "true"; SET auto_explain.log_timing= "true"; SET auto_explain.log_triggers= "true"; SET auto_explain.log_verbose= "true"; SET auto_explain.log_format= "text"; SET auto_explain.log_nested_statements= "true"; SET auto_explain.sample_rate= "1"; select * from get_list(1,2,3,4,5); в /var/lib/pgsql/9.6/data/pg_log в нужном файле лога ничего не появляется ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 15:00 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff Павел Лузанов пропущено... Для тестирования можно подключить auto_explain и выставить auto_explain.log_min_duration = 0; auto_explain.log_nested_statements = on; Тогда в логе увидите и запрос, и план. не получается заюзать. Захожу в dbeaver под суперюзером postgres выполняю LOAD 'auto_explain'; SET auto_explain.log_min_duration= "0"; SET auto_explain.log_analyze= "true"; SET auto_explain.log_buffers= "true"; SET auto_explain.log_timing= "true"; SET auto_explain.log_triggers= "true"; SET auto_explain.log_verbose= "true"; SET auto_explain.log_format= "text"; SET auto_explain.log_nested_statements= "true"; SET auto_explain.sample_rate= "1"; select * from get_list(1,2,3,4,5); в /var/lib/pgsql/9.6/data/pg_log в нужном файле лога ничего не появляется Никогда так не делал. Всегда загоняю его в shared_preload_libraries и в конфиг. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 15:05 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
mefman kliff пропущено... не получается заюзать. Захожу в dbeaver под суперюзером postgres выполняю LOAD 'auto_explain'; SET auto_explain.log_min_duration= "0"; SET auto_explain.log_analyze= "true"; SET auto_explain.log_buffers= "true"; SET auto_explain.log_timing= "true"; SET auto_explain.log_triggers= "true"; SET auto_explain.log_verbose= "true"; SET auto_explain.log_format= "text"; SET auto_explain.log_nested_statements= "true"; SET auto_explain.sample_rate= "1"; select * from get_list(1,2,3,4,5); в /var/lib/pgsql/9.6/data/pg_log в нужном файле лога ничего не появляется Никогда так не делал. Всегда загоняю его в shared_preload_libraries и в конфиг. Получилось, спасибо, надо просто в одной транзакции делать. Ну мне пока только один запрос надо, в настройки не лезу пока ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 15:10 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
mefman, а можете еще подсказать, все-таки сам запрос в логе я вижу не с итоговыми значениями, которые я послал параметрами в функцию, а в виде исходника Select column1, column2, column3, column4 from main_table mt where mt.c1 = par1 and mt.c2 = par2 or mt.c3 = par3 Есть какая то возможность вывести его сразу со значениями параметров Select column1, column2, column3, column4 from main_table mt where mt.c1 = 12 and mt.c2 = 4 or mt.c3 = 10 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 19:52 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff, внутри функции вставить Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 20:24 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
fte kliff, внутри функции вставить Код: sql 1.
сами значения переменных не интересуют, интересует реально выполняемый запрос. Значения переменных мне и без функции известны, выводить их не за чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 07:42 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Пока решил вопрос следующим путем. Переписал функцию с sql на plpgsql Динамически собрал запрос q = 'Select column1, column2, column3, column4 from main_table mt where mt.c1 ='|| par1||' and mt.c2 ='|| par2||' or mt.c3 =' ||par3; выполнил его RETURN QUERY EXECUTE q; Теперь в логах получаю запрос с данными вместо переменных ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:08 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff Теперь в логах получаю запрос с данными вместо переменных kliff сами значения переменных не интересуют Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:58 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Melkij kliff Теперь в логах получаю запрос с данными вместо переменных kliff сами значения переменных не интересуют Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса. Я определился в самом первом вопросе. Из него что то не понятно? Я нигде не упоминал, что мне нужен план запроса. Мн нужен текст реально выполняемого в БД запроса и все, это весь вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 10:29 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Melkij kliff Теперь в логах получаю запрос с данными вместо переменных kliff сами значения переменных не интересуют Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса. запрос и план запроса вещи разные ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 10:31 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff Мн нужен текст реально выполняемого в БД запроса и все, это весь вопрос. Вы его получили. Это вон тот с where mt.c1 = par1. Да - это именно текст реально выполняемого запроса. И да, в нём именно что не подставляются параметры. Вообще. Потому что зачем? Параметры так отдельным готовым списком и передаются executor'у. См, например, https://github.com/postgres/postgres/blob/REL_12_STABLE/src/pl/plpgsql/src/pl_exec.c#L4094 kliff запрос и план запроса вещи разные Именно что. Если вы утверждаете что вам не нужны значения параметров - то зачем вы их упорно ищете? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 11:09 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Melkij kliff Мн нужен текст реально выполняемого в БД запроса и все, это весь вопрос. Вы его получили. Это вон тот с where mt.c1 = par1. Да - это именно текст реально выполняемого запроса. И да, в нём именно что не подставляются параметры. Вообще. Потому что зачем? Параметры так отдельным готовым списком и передаются executor'у. См, например, https://github.com/postgres/postgres/blob/REL_12_STABLE/src/pl/plpgsql/src/pl_exec.c#L4094 kliff запрос и план запроса вещи разные Именно что. Если вы утверждаете что вам не нужны значения параметров - то зачем вы их упорно ищете? 1. как с запросом работает БД это понятно, но у меня другая постановка проблемы. Зачем мне, ну предположим у меня 200 параметров в запросе и рядом отдельно список значений этих 200 параметров. Вы как бы поступили, если у вас задача, гонять этот запрос в БД и анализировать результат изменений в нем? Я вот получил запрос и в бобре его гоняю, пока удобнее не придумал. 2. да не ищу я значения параметров, откуда вы это взяли? Я же написал, запрос есть, значения для него есть. Как еще сформулировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 12:10 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
kliff Зачем мне, ну предположим у меня 200 параметров в запросе и рядом отдельно список значений этих 200 параметров. Вы как бы поступили, если у вас задача, гонять этот запрос в БД и анализировать результат изменений в нем? - странно посмотреть на автора хранимки. - подставить вручную или скрипт форматирования набросать, смотря что будет проще. Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще kliff но у меня другая постановка проблемы Видимо я мысленно прицепился к изначальной фразе "увидеть реальный план", каковую задачу решает auto_explain сам по себе и потому удивился дальнейшим манипуляциям. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 12:39 |
|
Как вы отлаживаете запросы в функциях?
|
|||
---|---|---|---|
#18+
Melkij kliff Зачем мне, ну предположим у меня 200 параметров в запросе и рядом отдельно список значений этих 200 параметров. Вы как бы поступили, если у вас задача, гонять этот запрос в БД и анализировать результат изменений в нем? - странно посмотреть на автора хранимки. - подставить вручную или скрипт форматирования набросать, смотря что будет проще. Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще kliff но у меня другая постановка проблемы Видимо я мысленно прицепился к изначальной фразе "увидеть реальный план", каковую задачу решает auto_explain сам по себе и потому удивился дальнейшим манипуляциям. 1. подставить вручную 200 параметров не представляю как это может быть простым. Скрипт может быть, знать бы как. "Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще" - именно поэтому задал вопрос здесь. Я не писал нигде, что нашел прекрасное решение. Просто на безрыбье пока так. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2020, 14:20 |
|
|
start [/forum/topic.php?fid=53&msg=39971715&tid=1994632]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 172ms |
0 / 0 |