Анализ использования индекса PostgreSQL - PullRequest
76 голосов
/ 23 июля 2010

Существует ли инструмент или метод для анализа Postgres и определения того, какие недостающие индексы следует создать, а какие неиспользуемые индексы следует удалить? У меня есть небольшой опыт работы с инструментом «профилировщик» для SQLServer, но я не знаю аналогичного инструмента, включенного в Postgres.

Ответы [ 9 ]

146 голосов
/ 10 октября 2012

Мне нравится находить отсутствующие индексы:

SELECT
  relname                                               AS TableName,
  to_char(seq_scan, '999,999,999,999')                  AS TotalSeqScan,
  to_char(idx_scan, '999,999,999,999')                  AS TotalIndexScan,
  to_char(n_live_tup, '999,999,999,999')                AS TableRows,
  pg_size_pretty(pg_relation_size(relname :: regclass)) AS TableSize
FROM pg_stat_all_tables
WHERE schemaname = 'public'
      AND 50 * seq_scan > idx_scan -- more then 2%
      AND n_live_tup > 10000
      AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;

Это проверяет, есть ли больше последовательных сканирований, чем индексных сканирований. Если таблица небольшая, она игнорируется, поскольку Postgres, похоже, предпочитает для них сканирование последовательности.

Над запросом выявляются отсутствующие индексы.

Следующим шагом будет обнаружение отсутствующих комбинированных индексов. Я думаю, это не легко, но выполнимо. Может быть, анализ медленных запросов ... Я слышал, pg_stat_statements может помочь ...

18 голосов
/ 23 июля 2010

Проверьте статистику.pg_stat_user_tables и pg_stat_user_indexes - это те, с которых нужно начинать.

См. " Сборщик статистики ".

8 голосов
/ 23 июля 2010

По определению недостающие индексы подходят .... Нет. Но есть некоторые планы сделать это проще в будущем выпуске, такие как псевдоиндексы и машиночитаемый EXPLAIN.

В настоящее время вам нужно EXPLAIN ANALYZE плохо выполнить запросы, а затем вручную определить лучший маршрут. Некоторые анализаторы журналов, такие как pgFouine , могут помочь определить запросы.

Что касается неиспользуемого индекса, вы можете использовать что-то вроде следующего, чтобы помочь идентифицировать их:

select * from pg_stat_all_indexes where schemaname <> 'pg_catalog';

Это поможет идентифицировать кортежи, прочитанные, отсканированные, извлеченные.

6 голосов
/ 30 декабря 2015

Еще одним новым и интересным инструментом для анализа PostgreSQL является PgHero . Он больше ориентирован на настройку базы данных и делает многочисленные анализы и предложения.

screenshot

3 голосов
/ 19 января 2017

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

Ссылка взята из этого блога.

SELECT
    pt.tablename AS TableName
    ,t.indexname AS IndexName
    ,to_char(pc.reltuples, '999,999,999,999') AS TotalRows
    ,pg_size_pretty(pg_relation_size(quote_ident(pt.tablename)::text)) AS TableSize
    ,pg_size_pretty(pg_relation_size(quote_ident(t.indexrelname)::text)) AS IndexSize
    ,to_char(t.idx_scan, '999,999,999,999') AS TotalNumberOfScan
    ,to_char(t.idx_tup_read, '999,999,999,999') AS TotalTupleRead
    ,to_char(t.idx_tup_fetch, '999,999,999,999') AS TotalTupleFetched
FROM pg_tables AS pt
LEFT OUTER JOIN pg_class AS pc 
    ON pt.tablename=pc.relname
LEFT OUTER JOIN
( 
    SELECT 
        pc.relname AS TableName
        ,pc2.relname AS IndexName
        ,psai.idx_scan
        ,psai.idx_tup_read
        ,psai.idx_tup_fetch
        ,psai.indexrelname 
    FROM pg_index AS pi
    JOIN pg_class AS pc 
        ON pc.oid = pi.indrelid
    JOIN pg_class AS pc2 
        ON pc2.oid = pi.indexrelid
    JOIN pg_stat_all_indexes AS psai 
        ON pi.indexrelid = psai.indexrelid 
)AS T
    ON pt.tablename = T.TableName
WHERE pt.schemaname='public'
ORDER BY 1;
3 голосов
/ 25 июля 2010

Существует несколько ссылок на скрипты, которые помогут вам найти неиспользуемые индексы на PostgreSQL wiki .Основной метод состоит в том, чтобы посмотреть на pg_stat_user_indexes и найти те, в которых idx_scan - количество раз, которое этот индекс использовался для ответа на запросы, равно нулю или, по крайней мере, очень мало.Если приложение изменилось и ранее использовавшийся индекс, вероятно, не сейчас, вам иногда нужно запустить pg_stat_reset(), чтобы вернуть всю статистику обратно в 0, а затем собрать новые данные;Вы можете сохранить текущие значения для всего и вместо этого вычислить дельту, чтобы выяснить это.

Нет доступных хороших инструментов, которые бы предлагали пропустить индексы.Один из подходов состоит в том, чтобы регистрировать запросы, которые вы выполняете, и анализировать, какие из них требуют много времени, используя инструмент анализа журнала запросов, например pgFouine или pqa.См. " Регистрация трудных запросов " для получения дополнительной информации.

Другой подход заключается в просмотре pg_stat_user_tables и поиске таблиц с большим количеством последовательных сканирований, где seq_tup_fetch велико.Когда используется индекс, вместо него увеличивается idx_fetch_tup.Это может подсказать вам, когда таблица недостаточно хорошо проиндексирована, чтобы отвечать на запросы к ней.

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

1 голос
/ 30 декабря 2015

PoWA кажется интересным инструментом для PostgreSQL 9.4+.Он собирает статистику, визуализирует ее и предлагает индексы.Он использует расширение pg_stat_statements.

PoWA - это PostgreSQL Workload Analyzer, который собирает статистику производительности и предоставляет графики и диаграммы в реальном времени, помогающие отслеживать и настраивать серверы PostgreSQL.Это похоже на Oracle AWR или SQL Server MDW.

0 голосов
/ 10 октября 2018
CREATE EXTENSION pgstattuple; 
CREATE TABLE test(t INT); 
INSERT INTO test VALUES(generate_series(1, 100000)); 
SELECT * FROM pgstatindex('test_idx'); 

version            | 2 
tree_level         | 2 
index_size         | 105332736 
root_block_no      | 412 
internal_pages     | 40 
leaf_pages         | 12804 
empty_pages        | 0 
deleted_pages      | 13 
avg_leaf_density   | 9.84 
leaf_fragmentation | 21.42 
0 голосов
/ 23 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...