powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL запросы стали подвисать
22 сообщений из 22, страница 1 из 1
SQL запросы стали подвисать
    #39684130
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую СУБД Postgresql, относительно не так давно, SQL запросы стали выполняться намного дольше по времени. Некоторые запросы выполняются в несколько десятков раз дольше.
Провел анализ работы БД (сравнил с данными месячной давности), проблем с памятью или процами нет. Но заметил что время доступа к разделу с БД различается на порядок, что можно с эти сделать, кроме банального VACUUM FULL ANALYZE?
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684132
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Использую СУБД Postgresql, относительно не так давно, SQL запросы стали выполняться намного дольше по времени. Некоторые запросы выполняются в несколько десятков раз дольше.
Провел анализ работы БД (сравнил с данными месячной давности), проблем с памятью или процами нет. Но заметил что время доступа к разделу с БД различается на порядок, что можно с эти сделать, кроме банального VACUUM FULL ANALYZE?

Разбираться с загрузкой и производительностью дисковой системы с одной стороны.
И разбираться с запросами котрые больше всего времени занимают (с учетом диска) с другой стороны.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684151
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reindex скорее всего нужен
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684163
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Если "банальный VACUUM FULL ANALYZE" помогает, то может что-то не то с настройками autovacuum.
Что вот такой запрос возвращает:
select name,setting,unit from pg_settings where name ~ 'autovacuum';
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684442
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В запросе стал использоваться другой индекс, правильно ли я понимаю, после
VACUUM FULL ANALYZE должна обновиться статистика, которую использует планировщик для выбора оптимального
способа выполнения запроса, также должен помочь REINDEX?
Есть ли еще способ кроме VACUUM FULL ANALYZE поставить "на путь истинный" планировщик?
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684448
Синий Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11В запросе стал использоваться другой индекс, правильно ли я понимаю, после
VACUUM FULL ANALYZE должна обновиться статистика, которую использует планировщик для выбора оптимального
способа выполнения запроса, также должен помочь REINDEX?
Есть ли еще способ кроме VACUUM FULL ANALYZE поставить "на путь истинный" планировщик?

VACUUM ANALYZE
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39684484
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Есть ли еще способ кроме VACUUM FULL ANALYZE поставить "на путь истинный" планировщик?
VACUUM не есть тоже самое, что и VACUUM FULL.
VACUUM помечает записи, которые ни одна транзакция в базе больше не может увидеть как свободное место. VACUUM FULL перестраивает таблицу (и все индексы) целиком.

ANALYZE — отдельная операция, которая осуществляется последней и обновляет статистику распределения данных в таблице для планирования запросов.
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685038
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению VACUUM и REINDEX не помогли.
Как работает планировщик POSTGRES, для меня загадка.
Есть такая же БД на другом сервере, в аналогичных запросах,
там используется нужный индекс, который раньше использовался на проблемной базе.
Приведу элементарный запрос и планы выполнения

Код: sql
1.
2.
3.
SELECT Filed1
FROM Table1
WHERE Field2 like '01%' AND Fileld3 = 123



План запроса на проблемной БД:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Unique  (cost=0.43..6.21 rows=1 width=8) (actual time=1.323..11.502 rows=184 loops=1)"
"  Buffers: shared hit=4806 read=416"
"  ->  Index Scan using "Index1" on "Table1"  (cost=0.43..6.20 rows=1 width=8) (actual time=1.320..11.473 rows=184 loops=1)"
"        Index Cond: ("Filed3" = 123)"
"        Filter: ("Field2" ~~ '01%'::text)"
"        Rows Removed by Filter: 37833"
"        Buffers: shared hit=4806 read=416"
"Planning time: 26.205 ms"
"Execution time: 11.571 ms"



Используется Index1 по полю Field2 с классом оператора varchar_pattern_ops, запрос выполнялся 25 секунд


С аналогичной БД на другом сервере

Код: sql
1.
2.
3.
4.
5.
6.
"Index Scan using "Index2" on "Table1"  (cost=0.69..8.71 rows=1 width=8) (actual time=0.052..0.426 rows=184 loops=1)"
"  Index Cond: (("Filed3" = 123) AND ("Field2" ~>=~ '01'::text) AND ("Field2" ~<~ '02'::text))"
"  Filter: ("Filed2" ~~ '01%'::text)"
"  Buffers: shared hit=189"
"Planning time: 0.558 ms"
"Execution time: 0.546 ms"


Используется Index2 по полям (Field2 с классом оператора varchar_pattern_ops, Field3), запрос выполнялся 50 миллисекунд

Как-то оптимизировать запрос нельзя, куда уж проще. У меня осталась последняя мысль, удалить Index1,
но будет ли во всех местах, где действительно нужен Index1, использоваться Index2 и не будет ли он тормозить эти запросы?
Буду рад любым конструктивным идеям
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685045
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Используется Index2 по полям (Field2 с классом оператора varchar_pattern_ops, Field3), запрос выполнялся 50 миллисекунд


Буду рад любым конструктивным идеям
Потому что локаль выбрана другая. posix - работает varchar.
А на первом сервере Вы указали en_US.UTF-8 или ru_RU.UTF-8, в общем, некошерный юникод - и varchar_pattern_ops не используется.

Проверяйте...
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685050
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

Невнимательно посмотрел. Не в локалях дело.
"Используется Index2 по полям (Field2 с классом оператора varchar_pattern_ops, Field3" на втором, а на первом не используется.
Если на первом сервере куча устаревших строк, не вычищенных вакуумом, при этом постоянно менялось поле Field3 - планировщик будет пытаться использовать индекс Index1, который не включает в себя Field3, а на втором сервере тот же индекс более кошерный, вот его планировщик и задействует.
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685070
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Что-то планы от разных запросов, хотя бы потому что в первом есть `Unique`, что говорит о наличии `DISTINCT` в запросе.
Также в первом плане “Rows Removed by Filter: 37833” — явно неподходящий индекс.
И где там “25 секунд”? В плане явно написано “Execution time: 11.571 ms”.

Вы уверены что структура таблиц и индексы одинаковы и валидны?..
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685125
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Вы правы, первый план для запроса вместе с DISTINCT, но суть от этого не меняется.
Время выполнения “Execution time: 11.571 ms” вместо 25 секунд, потому что это план запроса, который уже выполнил ранее и POSTGRES закэшировал результат и он выполняется 11 ms, первоначальный план
Код: sql
1.
2.
3.
4.
5.
6.
7.
"Index Scan using "Index1" on "Table1"   (cost=0.43..6.20 rows=1 width=8) (actual time=0.184..8.611 rows=184 loops=1)"
"  Index Cond: ("Filed3" = 123)"
"  Filter: ("Field2" ~~ '01%'::text)"
"  Rows Removed by Filter: 37833"
"  Buffers: shared hit=5219"
'Planning time: 2.804 ms'
'Execution time: 24963.109 ms' 


Структуры таблиц и индексов полностью идентичные. Данные одинаковые, если и есть отличия, то они минимальные.
Как смотрите на то, чтобы удалить Index1?
Будет ли во всех местах, где действительно нужен Index1, использоваться Index2 и не будет ли он тормозить эти запросы?
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685129
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

1. Включите `track_io_timing` в конфиге и приведите вывод `EXPLAIN (analyze, buffers)` ещё раз. Есть большое подозрение что диски у вас совсем не тянут

2. Если есть проблема с распуханием таблиц и индексов, то:
- надо сделать агрессивным автовакуум
- убедится что хватает autovacuum_max_workers
- проанализировать нагрузку на предмет наличия высоконагруженных таблиц (велосипедная очередь какая) и долгих отчётов в базе одновременно. если есть такое, то убрать долгие запросы на реплику с выключенным hot_standby_feedback и достаточным max_standby_streaming_delay
- после этого избавиться от bloat-а — pgcompacttable / pg_repack / VACUUM FULL (хотя я бы репак-ом лучше прошел)
- жестко контролировать длительность транзакций (не более 10 минут) через отстрел в кроне

Агрессивный вакуум может опять-таки в диски упереться, что говорит о том, что надо думать о железе получше.
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685281
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11потому что это план запроса, который уже выполнил ранее и POSTGRES закэшировал результат
Нет у postgresql никакого кэша результатов.

polin11первоначальный план
Код: sql
1.
2.
3.
4.
5.
6.
7.
"Index Scan using "Index1" on "Table1"   (cost=0.43..6.20 rows=1 width=8) (actual time=0.184..8.611 rows=184 loops=1)"
"  Index Cond: ("Filed3" = 123)"
"  Filter: ("Field2" ~~ '01%'::text)"
"  Rows Removed by Filter: 37833"
"  Buffers: shared hit=5219"
'Planning time: 2.804 ms'
'Execution time: 24963.109 ms' 


Сомнительно. Это весь план? Внимание на actual time и 100% shared hit
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685483
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разница между планами и временем выполнения соответственно начинается даже при запросе
Код: sql
1.
2.
3.
  select "Field1" 
  from "Table1" 
  where "Field2" like '01%'



План на проблемной базе

Код: sql
1.
2.
3.
4.
5.
6.
"Index Scan using "Index1" on "Table1"  (cost=0.69..8.71 rows=1384 width=8) (actual time=0.150..35919.512 rows=68445 loops=1)"
"  Index Cond: (("Field2" ~>=~ '01'::text) AND ("Field2" ~<~ '02'::text))"
"  Filter: ("Field2" ~~ '01%'::text)"
"  Buffers: shared hit=27768 read=22839"
"Planning time: 2.604 ms"
"Execution time: 35938.358 ms"



план на тестовой базе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
"Bitmap Heap Scan on "Table1"  (cost=87.97..7136.05 rows=1178 width=8) (actual time=19.847..110.466 rows=64985 loops=1)"
"  Filter: ("Field2" ~~ '01%'::text)"
"  Heap Blocks: exact=13466"
"  Buffers: shared hit=13853"
"  ->  Bitmap Index Scan on "Index1"  (cost=0.00..87.68 rows=1899 width=0) (actual time=17.049..17.049 rows=64985 loops=1)"
"        Index Cond: (("Field2" ~>=~ '01'::text) AND ("Field2" ~<~ '02'::text))"
"        Buffers: shared hit=387"
"Planning time: 1.151 ms"
"Execution time: 116.189 ms"
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39685742
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

А если сделать `REINDEX INDEX "Index1"` в проблемной базе?..
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39686451
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно скрыть оп планировщика поле Field2, чтобы использовался индекс по Fileld3. В запросе
Код: sql
1.
2.
3.
SELECT Filed1
FROM Table1
WHERE Field2 like '01%' AND Fileld3 = 123



В поле Field2 в нижнем регистре тип данных text
Вариант 1:
Код: sql
1.
2.
3.
SELECT Filed1
FROM Table1
WHERE LOWER(Field2) like '01%' AND Fileld3 = 123



Вариант 2:
Код: sql
1.
2.
3.
SELECT Filed1
FROM Table1
WHERE  (Field2 like '01%')::integer=1 AND Fileld3 = 123


Может есть варианты более оптимальные?
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39686601
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11
С аналогичной БД на другом сервере

Код: sql
1.
2.
3.
4.
5.
6.
"Index Scan using "Index2" on "Table1"  (cost=0.69..8.71 rows=1 width=8) (actual time=0.052..0.426 rows=184 loops=1)"
"  Index Cond: (("Filed3" = 123) AND ("Field2" ~>=~ '01'::text) AND ("Field2" ~<~ '02'::text))"
"  Filter: ("Filed2" ~~ '01%'::text)"
"  Buffers: shared hit=189"
"Planning time: 0.558 ms"
"Execution time: 0.546 ms"


Используется Index2 по полям (Field2 с классом оператора varchar_pattern_ops, Field3), запрос выполнялся 50 миллисекунд



дык у вас и тут индекс неправильный,
переставьте порядок полей в индексе, опсы те же.
и пж сильно полегчает с планированием
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39686633
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Прошу прощения, я неправильно написал. Порядок полей в индексе Index2 по полям (Field3, Field2).
Для поля значения Field3 может соотв. несколько тысяч значений Field2.
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39686684
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте нащупать, что оно вам отдаст на

Код: sql
1.
2.
3.
4.
5.
6.
SELECT "Filed1"
FROM Table1
WHERE
(("Filed3" = 123) AND ("Field2" ~>=~ '01'::text) AND ("Field2" ~<~ '02'::text))
-- order by WTFF("Field2")
limit 1



и где в нынешней доке есть ойператор "~>=~" ? (совсем дока испортилась)
нет ли там рядом модификатора для одербая в смысле сравнения паттерн-опсов (чтоб этому олегу оксана не дала)
могабыть его на индекскан руками натянуть ? лимитом т.е. и вот этими вот сравнениями и неизвестным покуда одербаем для паттернопсов ?
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39687089
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогли следующие волшебные команды

ALTER TABLE "Table1" ALTER COLUMN "Field2" SET STATISTICS 10000;
VACUUM ANALYZE "Table1";
...
Рейтинг: 0 / 0
SQL запросы стали подвисать
    #39687090
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВСЕМ СПАСИБО ЗА ПОМОЩЬ
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL запросы стали подвисать
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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