Мониторинг индексов в PostgreSQL очень важен, потому как индексы могут разрастаться или не использоваться.

Поиск неиспользуемых индексов

Иногда случается, что в базе данных некоторые индексы не нужны. То есть при создании базы сделали лишние или пересекающиеся индексы, а они на самом деле не используются. Лишние индексы занимают место, а также добавляют накладные расходы. Как только вы меняете таблицу, вам нужно обновить все индексы в ней. Поэтому мониторинг индексов необходим в PostgreSQL.

В представлении pg_stat_all_indexes в поле idx.scan вы можете увидеть количество обращений к индексу. Если там ноль, значит индекс не используется и возможно его следует удалить. Но следует точно понимать что вы делаете, и перепроверить все перед удалением таких индексов.

Посмотреть представление pg_stat_all_indexes для какой-нибудь таблицы можно так:

postgres@s-pg13:~$ psql -d data_lowlevel
Timing is on.
psql (13.3)
Type "help" for help.

postgres@data_lowlevel=# SELECT * FROM pg_stat_all_indexes WHERE relname='t';
 relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
-------+------------+------------+---------+--------------+----------+--------------+---------------
 16497 |      16504 | public     | t       | t_pkey       |        0 |            0 |             0
(1 row)

Time: 10,941 ms

Перестроение индексов

Помимо лишних индексов существует другая проблема — разрастание индексов. Например у вас выросла таблица и индексы в ней тоже разрослись. Они перестали помещаться в одной странице и заняли ещё одну. Затем вы почистили табличку с помощью VACUUM, а страницы индексов всё равно останется две, просто в них образуются пустоты. Страницы могут только делиться, а склеиваться назад уже не могут (если не использовать VACUUM FULL).

Существует команда REINDEX которая занимается перестроением индексов. Можно перестроить как отдельный индекс, так и все индексы в таблице, в базе данных или во всей системе:

  • REINDEX INDEX индекс;
  • REINDEX TABLE таблица;
  • REINDEX DATABASE база;
  • REINDEX SYSTEM;

Команда VACUUM FULL перестраивает и таблицы и индексы, а команда REINDEX только индексы. REINDEX также устанавливает эксклюзивную блокировку на таблицу.

Пересоздание индексов

Можно пересоздать индексы без эксклюзивной блокировки с помощью ключевого слова CONCURRENTLY:

postgres=# CREATE INDEX новый ON ... CONCURRENTLY;
postgres=# DROP INDEX старый;

С помощью такого перестроения индексов, новый индекс будет строится дольше, но это не приведёт к блокировке таблицы. Также такое создание нового индекса может завершиться с ошибкой, тогда этот новый индекс нужно удалить и попробовать сделать новый индекс ещё раз.

Индекс может служить для поддержки ограничения целостности, например для первичного ключа. В этом случае меняем индексы таким способом:

postgres=# CREATE UNIQUE INDEX новый ON ... CONCURRENTLY;
postgres=# ALTER TABLE ...
   DROP CONSTRAINT старое,
   ADD CONSTRAINT новое [UNIQUE|PRIMARI KEY] USING INDEX новый;

Сводка
Мониторинг индексов в PostgreSQL и их перестроение
Имя статьи
Мониторинг индексов в PostgreSQL и их перестроение
Описание
Мониторинг индексов в PostgreSQL тоже очень важен. Потому как индексы могут разрастаться или не использоваться

3 Replies to “Мониторинг индексов в PostgreSQL и их перестроение”

  1. А где можно почитать (кроме документации) про сами индексы — как создать, просмотреть и пр.? На Вашем сайте есть?

    1. Пока про сами индексы ничего не писал. В будущем планирую написать, но не знаю когда это у меня получится. А пока можете поискать информацию на других сайтах

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *