Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
10.03.2018, 02:30
|
|||
---|---|---|---|
|
|||
Запрос в хранимой процедуре выполняется медленне, чем показывает explain analyze |
|||
#18+
Доброго времени суток, коллеги. Необходима помощь в следующей ситуации: небольшой запрос в хранимой процедуре выполняется значительно медленнее, чем показывает его explain analyze. explain analyze я вставил непосредственно в хранимую процедуру перед выполнением запроса. Вот результат pg_stat после отработки процедуры: Это результат непосредственно запроса в pg_stat: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Это его explain, вызванный прямо в процедуре (в pg_stat): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Сам план и анализ запроса (из процедуры): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Если запрос выполнять из консоли, то время выполнения около 4.5 сек, что соответствует результату explain analyze work_mem - 1GB vacuum analyze выполнен прямо перед тестом. Создание временной таблицы не может быть камнем преткновения, т.к. аналогичные таблицы в этой же процедуре создаются примерно за 3 мс. Результат запроса - 50 строк, содержащих int8. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2018, 04:25
|
|||
---|---|---|---|
|
|||
Запрос в хранимой процедуре выполняется медленне, чем показывает explain analyze |
|||
#18+
sKot, CREATE TABLE AS отключает параллельное выполнение запроса на нескольких ядрах. Вот и получаете замедление в 2 с копейками раза относительно просто запроса PS: сделайте триграмный индекс на lower(s__r.FULL_NAME - и будет вам счастье что с хранимкой что без https://www.postgresql.org/docs/10/static/pgtrgm.html ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2018, 13:31
|
|||
---|---|---|---|
|
|||
Запрос в хранимой процедуре выполняется медленне, чем показывает explain analyze |
|||
#18+
Максим, спасибо! Правильно ли я понимаю, что "open cursor for execute" также отключает параллельное выполнение? Если я из процедуры возвращаю refcursor, то время выполнения запроса такое же как и для create table as. Есть ли способ возвращать их процедуры некое результирующее множество с произвольным набором столбцов? Пробовал "RETURN QUERY EXECUTE", но он требует определение типа для возвращаемых записей, а результирующий запрос содержит недетерменированное количество столбцов (зависит от параметров, передаваемых в ХП). Триграммы попробую, по результатам отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2018, 20:00
|
|||
---|---|---|---|
|
|||
Запрос в хранимой процедуре выполняется медленне, чем показывает explain analyze |
|||
#18+
Максим, я ещё не понял в чём тут подвох, но ускорение на триграммных индексах более чем в 7 раз!!! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
СПАСИБО ОГРОМНОЕ! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.03.2018, 02:37
|
|||
---|---|---|---|
|
|||
Запрос в хранимой процедуре выполняется медленне, чем показывает explain analyze |
|||
#18+
sKotМаксим, спасибо! Правильно ли я понимаю, что "open cursor for execute" также отключает параллельное выполнение? Если я из процедуры возвращаю refcursor, то время выполнения запроса такое же как и для create table as. Да отключает. Почти все кроме просто написанного select сейчас отключает параллельное выполнение запросов по ряду причин архитектурных. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/moderation_log.php?user_name=%D0%B3%D0%BE%D1%81%D1%82%D1%8C945718]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 485ms |
total: | 641ms |
0 / 0 |