Удалить неиспользуемые индексы - PullRequest
0 голосов
/ 15 мая 2018

Я запускаю этот запрос для проверки наличия в моей базе данных неиспользуемых индексов.

select 
    t.tablename AS "relation",
    indexname,
    c.reltuples AS num_rows,
    pg_relation_size(quote_ident(t.tablename)::text) AS table_size,
    pg_relation_size(quote_ident(indexrelname)::text) AS index_size,
    idx_scan AS number_of_scans,
    idx_tup_read AS tuples_read,
    idx_tup_fetch AS tuples_fetched
FROM pg_tables t
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname
LEFT OUTER JOIN
    ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, psai.idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x
           JOIN pg_class c ON c.oid = x.indrelid
           JOIN pg_class ipg ON ipg.oid = x.indexrelid
           JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid )
    AS foo
    ON t.tablename = foo.ctablename
WHERE t.schemaname='public'
and idx_scan = 0
ORDER BY 
--1,2
--6
5 desc
;

И я получил много строк, где все поля равны нулю:

number_of_scans,
tuples_read,
tuples_fetched

Это значит, что я могу их бросить? Есть ли вероятность, что эти метаданные устарели? Как я могу это проверить?

Я использую Postgres с версией 9.6

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ваш запрос пропускает некоторые виды использования индексов, которые не требуют их сканирования:

  • они применяют ограничения первичного ключа, уникальности и исключения

  • они влияют на сбор статистики (для & ldquo; индексов выражений & rdquo;)

Вот мой золотой стандарт из моего блога :

SELECT s.schemaname,
       s.relname AS tablename,
       s.indexrelname AS indexname,
       pg_relation_size(s.indexrelid) AS index_size
FROM pg_catalog.pg_stat_user_indexes s
   JOIN pg_catalog.pg_index i ON s.indexrelid = i.indexrelid
WHERE s.idx_scan = 0      -- has never been scanned
  AND 0 <>ALL (i.indkey)  -- no index column is an expression
  AND NOT EXISTS          -- does not enforce a constraint
         (SELECT 1 FROM pg_catalog.pg_constraint c
          WHERE c.conindid = s.indexrelid)
ORDER BY pg_relation_size(s.indexrelid) DESC;

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

Есть несколько предостережений:

  • сбор статистики должен быть запущен (найдите в журнале процесс & ldquo; сборщика статистики & rdquo; и посмотрите, есть ли у вас предупреждения о & ldquo; устаревшей статистике & rdquo;)

  • выполнить запрос к вашей производственной базе данных

  • если ваша программа работает на многих сайтах, попробуйте ее на всех (разные пользователи используют разные схемы использования)

0 голосов
/ 15 мая 2018

Возможно, вы можете удалить их, однако вы должны убедиться, что ваш запрос выполняется после обычной рабочей нагрузки.То есть есть ли индексы, которые не показывают использование в этом запросе, используемое только в определенные моменты времени, когда выполняются специализированные запросы?Отчетность на конец месяца, еженедельные прогоны и т. Д.?Мы сталкивались с этим пару раз - несколько крупных индексов не использовались в течение дня, но поддерживали итоги на конец месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...