Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вы отлаживаете запросы в функциях? / 18 сообщений из 18, страница 1 из 1
18.06.2020, 11:17
    #39970470
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Привет ребята.

Подскажите пожалуйста приемы отладки такого примера.

Есть функция
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, а потом выполнить сам запрос. Но может что то есть сподручнее
...
Рейтинг: 0 / 0
18.06.2020, 11:26
    #39970473
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
kliff

Какие есть способы, чтоб мне увидеть реальный итоговый запрос, в который все параметры подставлены? Можно ли его как то внутри функции хотя бы запихнуть в raise notice? Или не знаю в логе каком то посмотреть с целью увидеть реальный план?

Для тестирования можно подключить auto_explain и выставить
auto_explain.log_min_duration = 0;
auto_explain.log_nested_statements = on;

Тогда в логе увидите и запрос, и план.
...
Рейтинг: 0 / 0
18.06.2020, 11:36
    #39970476
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Павел Лузанов
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.
  auto_explain.log_min_duration: "0"
  auto_explain.log_analyze: "true"
  auto_explain.log_buffers: "true"
  auto_explain.log_timing: "true"
  auto_explain.log_triggers: "true"
  auto_explain.log_verbose: "true"
  auto_explain.log_format: "text"
  auto_explain.log_nested_statements: "true"
  auto_explain.sample_rate: "1"


А так - да, эта штука реально выручает.
А план потом можно прогнать через анализатор, например https://explain.tensor.ru/
...
Рейтинг: 0 / 0
18.06.2020, 11:44
    #39970477
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Спасибо большое ребят, буду пробовать.
...
Рейтинг: 0 / 0
18.06.2020, 15:00
    #39970545
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Павел Лузанов
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 в нужном файле лога ничего не появляется
...
Рейтинг: 0 / 0
18.06.2020, 15:05
    #39970548
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
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 и в конфиг.
...
Рейтинг: 0 / 0
18.06.2020, 15:10
    #39970549
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
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 и в конфиг.


Получилось, спасибо, надо просто в одной транзакции делать. Ну мне пока только один запрос надо, в настройки не лезу пока
...
Рейтинг: 0 / 0
18.06.2020, 19:52
    #39970641
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
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
?
...
Рейтинг: 0 / 0
18.06.2020, 20:24
    #39970651
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
kliff,

внутри функции вставить
Код: sql
1.
raise log 'par1:%, par2:%, par3:%', par1, par2, par3;
...
Рейтинг: 0 / 0
19.06.2020, 07:42
    #39970724
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
fte
kliff,

внутри функции вставить
Код: sql
1.
raise log 'par1:%, par2:%, par3:%', par1, par2, par3;



сами значения переменных не интересуют, интересует реально выполняемый запрос. Значения переменных мне и без функции известны, выводить их не за чем.
...
Рейтинг: 0 / 0
19.06.2020, 10:08
    #39970756
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Пока решил вопрос следующим путем.
Переписал функцию с 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;

Теперь в логах получаю запрос с данными вместо переменных
...
Рейтинг: 0 / 0
19.06.2020, 10:58
    #39970787
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
kliff
Теперь в логах получаю запрос с данными вместо переменных

kliff
сами значения переменных не интересуют

Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса.
...
Рейтинг: 0 / 0
22.06.2020, 10:29
    #39971712
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Melkij
kliff
Теперь в логах получаю запрос с данными вместо переменных

kliff
сами значения переменных не интересуют

Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса.


Я определился в самом первом вопросе. Из него что то не понятно?
Я нигде не упоминал, что мне нужен план запроса.

Мн нужен текст реально выполняемого в БД запроса и все, это весь вопрос.
...
Рейтинг: 0 / 0
22.06.2020, 10:31
    #39971715
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Melkij
kliff
Теперь в логах получаю запрос с данными вместо переменных

kliff
сами значения переменных не интересуют

Вы уж определитесь, вам нужны данные или вам нужен выполняемый план запроса.


запрос и план запроса вещи разные
...
Рейтинг: 0 / 0
22.06.2020, 11:09
    #39971741
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
запрос и план запроса вещи разные

Именно что. Если вы утверждаете что вам не нужны значения параметров - то зачем вы их упорно ищете?
...
Рейтинг: 0 / 0
22.06.2020, 12:10
    #39971771
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
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. да не ищу я значения параметров, откуда вы это взяли? Я же написал, запрос есть, значения для него есть. Как еще сформулировать?
...
Рейтинг: 0 / 0
22.06.2020, 12:39
    #39971790
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
kliff
Зачем мне, ну предположим у меня 200 параметров в запросе и рядом отдельно список значений этих 200 параметров. Вы как бы поступили, если у вас задача, гонять этот запрос в БД и анализировать результат изменений в нем?

- странно посмотреть на автора хранимки.
- подставить вручную или скрипт форматирования набросать, смотря что будет проще.
Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще

kliff
но у меня другая постановка проблемы

Видимо я мысленно прицепился к изначальной фразе "увидеть реальный план", каковую задачу решает auto_explain сам по себе и потому удивился дальнейшим манипуляциям.
...
Рейтинг: 0 / 0
22.06.2020, 14:20
    #39971843
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вы отлаживаете запросы в функциях?
Melkij
kliff
Зачем мне, ну предположим у меня 200 параметров в запросе и рядом отдельно список значений этих 200 параметров. Вы как бы поступили, если у вас задача, гонять этот запрос в БД и анализировать результат изменений в нем?

- странно посмотреть на автора хранимки.
- подставить вручную или скрипт форматирования набросать, смотря что будет проще.
Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще

kliff
но у меня другая постановка проблемы

Видимо я мысленно прицепился к изначальной фразе "увидеть реальный план", каковую задачу решает auto_explain сам по себе и потому удивился дальнейшим манипуляциям.


1. подставить вручную 200 параметров не представляю как это может быть простым. Скрипт может быть, знать бы как.

"Переписывать на конкатенацию (при том проигнорировать любое экранирование) - не выглядит проще" - именно поэтому задал вопрос здесь. Я не писал нигде, что нашел прекрасное решение. Просто на безрыбье пока так.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вы отлаживаете запросы в функциях? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]