Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Медленный DELETE по индексированному полю  [new]
bff7755a
Member

Откуда: Deutschland
Сообщений: 97
Есть таблица (~100 Мб). Удаляются строки по проиндексированному полю по условию = any(array[...]). Иногда (но не всегда) DELETE работает очень медленно (более 100 секунд). При этом SELECT с теми же условиями выполняется очень быстро. FK и триггеров на таблице нет. Селективность по этому полю нормальная. Пример плана:

db=*> explain (analyze,verbose,buffers)
delete from <table> WHERE <indexed_column> = 
ANY(array[5204878,5206098,5206363,5206364,5206365,5206366,5206367,5206368,5206369,5206370,5206371,5206372,5206373,5206374,5206375,5206376,5206377,5206378,5206379,5206380,5206381]);
                                                                                                                 QUERY PLAN                                                                  >
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
 Delete on public.<table>  (cost=0.42..271.19 rows=377 width=6) (actual time=131806.532..131806.533 rows=0 loops=1)
   Buffers: shared hit=1260 dirtied=12
   ->  Index Scan using <table>_<indexed_column>_idx on public.<table>  (cost=0.42..271.19 rows=377 width=6) (actual time=0.019..1.055 rows=958 loops=1)
         Output: ctid
         Index Cond: (<table>.<indexed_column> = ANY ('{5204878,5206098,5206363,5206364,5206365,5206366,5206367,5206368,5206369,5206370,5206371,5206372,5206373,5206374,5206375,5206376,5206377>
         Buffers: shared hit=302
 Planning Time: 0.085 ms
 Execution Time: 131806.552 ms
(8 rows)


В плане смущает две вещи:

1. Откуда такой пробел в actual time? Если верить результатам, данные из индекса были получены уже через ~ 1 мс, при этом удаление началось только через 131.8 секунд.
2. Почему набор ID в запросе и Index Cond разный (ID специально в плане оставил)?

Замена = any() на in() приводит к такому же результату. Версия PostgreSQL 12.4.

Помогите, пожалуйста, разобраться.
14 апр 21, 17:46    [22308973]     Ответить | Цитировать Сообщить модератору
 Re: Медленный DELETE по индексированному полю  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1285
bff7755a,

если включен log_lock_waits - посмотрите в логе, не ждали ли всё это время кого-то другого. Если выключен - то включить и подождать следующую аномалию.

bff7755a
2. Почему набор ID в запросе и Index Cond разный (ID специально в плане оставил)?

Поясните? При проверке методом ctrl+f в браузере - одинаковые данные. Только у вас похоже pager с горизонтальной прокруткой включен и о наличии хвоста справа сигнализирует символом >
14 апр 21, 19:01    [22309005]     Ответить | Цитировать Сообщить модератору
 Re: Медленный DELETE по индексированному полю  [new]
bff7755a
Member

Откуда: Deutschland
Сообщений: 97
Похоже, это действительно локи, спасибо. Просто я почему-то в pg_stat_activity ничего не увидел когда запускал запрос.
15 апр 21, 10:56    [22309225]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить