Моя версия Postgres - 9,6
Я пытался сегодня удалить индекс из моей БД с помощью этой команды:
drop index index_name;
И это вызвало много блокировок - все приложение завислопока я не уничтожил все сеансы отбрасывания (почему он был разделен на несколько сеансов?).
Когда я проверял блокировки, я видел, что почти все заблокированные сеансы выполняют этот запрос:
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM
pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = <index_able_name>::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum;
Имеет ли смысл блокировать действия системы?
Поэтому я решил удалить индекс с одновременной опцией для предотвращения блокировок.
drop index concurrently index_name;
Я выполняю его сейчас из PGAdmin (потому что вы не можете запустить его из транзакции noraml).
Прошло 20 минут и еще не закончилось.Размер индекса составляет 20 МБ + -.
И когда я проверяю БД на наличие блокировок, я вижу, что в этой таблице есть запрос на выборку, и это блокирует команду удаления.
Но когда я взялэто выберите и выполните в другом сеансе - это было быстро (2-3) секунды.
Так почему же это блокирует мое падение?Есть ли другой вариант сделать это?может, вместо этого отключить индекс?