Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

INDEX_OVERHEAD_BLOAT 1С:Предприятие и СУБД

Поиск и удаление неиспользуемых и дублирующих индексов в PostgreSQL

Обновлено: 26.08.2026 · Официальная документация ↗
  • Медленная вставка и обновление данных (INSERT/UPDATE) в сильно индексированных таблицах.
  • Чрезмерный объем кэша shared_buffers, занятый «холодными» индексами.
  • Раздувание объема резервных копий из-за наличия идентичных или перекрывающихся индексов.

1. Поиск абсолютно неиспользуемых индексов (idx_scan = 0)

Запрос исключает первичные ключи и уникальные ограничения:

SELECT 
    schemaname || '.' || relname AS table_name,
    indexrelname AS index_name,
    pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
    idx_scan AS index_scans
FROM pg_stat_user_indexes ui
JOIN pg_index i ON ui.indexrelid = i.indexrelid
WHERE NOT i.indisunique 
  AND NOT i.indisprimary
  AND ui.idx_scan = 0
ORDER BY pg_relation_size(i.indexrelid) DESC
LIMIT 20;

2. Поиск дублирующих и избыточных индексов

Например, индекс на (a) избыточен, если уже существует композитный индекс на (a, b):

SELECT 
    indrelid::regclass AS table_name,
    indexrelid::regclass AS redundant_index,
    indkey::text AS redundant_keys
FROM pg_index
WHERE indisvalid
ORDER BY indrelid;

3. Безопасное удаление неиспользуемого индекса

Используйте CONCURRENTLY для исключения блокировки таблицы во время удаления:

DROP INDEX CONCURRENTLY IF EXISTS idx_orders_old_status;

4. Сброс счетчиков статистики индексов

Если вы хотите начать чистый аудит после релиза:

SELECT pg_stat_reset();
💡 Практика специалистов: Перед удалением подозрительного индекса в production-среде мониторьте его использование не менее 30-60 дней, чтобы убедиться в отсутствии зависимостей в редких квартальных закрытиях периодов (особенно в 1С).

Частые вопросы (FAQ)

Почему нельзя удалять индекс сразу, если idx_scan = 0?

Статистика pg_stat_user_indexes накапливается с момента последнего сброса или рестарта. Индекс может использоваться редко, но быть критически важным для ежемесячных тяжелых отчетов или регламентных задач.

Учитывает ли idx_scan сканирования по внешним ключам (Foreign Keys)?

Да, если планировщик использует этот индекс для проверки ограничений каскадного удаления (ON DELETE CASCADE) или соединений, это увеличивает счетчик idx_scan.

Блокирует ли DROP INDEX CONCURRENTLY запись в таблицу?

Нет. Команда ожидает завершения активных транзакций, удерживающих слабую блокировку, и удаляет метаданные без взятия исключительного AccessExclusiveLock на саму таблицу.

Как оценить суммарный размер всех индексов конкретной таблицы?

Выполните запрос: SELECT pg_size_pretty(pg_indexes_size('my_table_name'));.

Полезные материалы
Рекомендуем