PostgreSQL索引使用分析

有没有一种工具或方法来分析Postgres,并确定应该创build哪些缺失的索引,以及哪些未使用的索引应该被删除? 我有一点经验做这与SQLServer的“探查器”工具,但我不知道Postgres中包含一个类似的工具。

我喜欢这个find缺失的索引:

SELECT schemaname, relname, seq_scan-idx_scan AS too_much_seq, case when seq_scan-idx_scan>0 THEN 'Missing Index?' ELSE 'OK' END, pg_relation_size(format('%I.%I', schemaname, relname)::regclass) AS rel_size, seq_scan, idx_scan FROM pg_stat_user_tables WHERE pg_relation_size(format('%I.%I', schemaname, relname)::regclass)>80000 ORDER BY too_much_seq DESC; 

这将检查是否有更多的序列扫描,然后索引扫描。 如果表格很小,它会被忽略,因为Postgres似乎更喜欢序列扫描。

上面的查询显示缺less索引。

下一步将是检测缺less的组合索引。 我想这不容易,但可行。 也许分析缓慢的查询…我听说pg_stat_statements可以帮助…

检查统计数据。 pg_stat_user_tablespg_stat_user_indexes是开始的。

请参阅“ 统计收集器 ”。

关于确定缺失索引的方法….不。 但是有一些计划在将来的版本中使这更容易,比如伪索引和机器可读的EXPLAIN。

目前,您需要EXPLAIN ANALYZE性能不佳的查询,然后手动确定最佳路线。 一些日志分析器,如pgFouine可以帮助确定查询。

至于未使用的索引,你可以使用类似下面的内容来帮助识别它们:

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

这将有助于识别读取,扫描,提取的元组。

另一个分析PostgreSQL的新而有趣的工具是PgHero 。 它更侧重于调整数据库,并提出许多分析和build议。

截图

有多个脚本链接可以帮助您在PostgreSQL wiki中find未使用的索引。 基本技巧是查看pg_stat_user_indexes并查找其中idx_scan (该索引用于回答查询的次数)为零或至less非常低的计数。 如果应用程序发生了变化,并且以前使用的索引可能不是现在,则有时必须运行pg_stat_reset()才能将所有统计信息恢复为0,然后收集新数据; 你可能会保存所有的当前值,并计算一个增量而不是计算出来。

目前还没有好的工具可以提供缺失的索引。 一种方法是logging您正在运行的查询,并使用查询日志分析工具(如pgFouine或pqa)分析哪些查询需要很长时间才能运行。 请参阅“ logging困难查询 ”了解更多信息。

另一种方法是查看pg_stat_user_tables并查找对它们有大量顺序扫描的表,其中seq_tup_fetch很大。 当使用索引时, idx_fetch_tup计数会增加。 这可以告诉你,当一个表索引不足以回答对它的查询。

其实搞清楚你应该索引哪些列? 这通常会导致查询日志分析的东西再次。

您可以使用以下查询来查找索引使用情况和索引大小:

参考来自这个博客。

 SELECT pt.tablename AS TableName ,t.indexname AS IndexName ,pc.reltuples 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 ,t.idx_scan AS TotalNumberOfScan ,t.idx_tup_read AS TotalTupleRead ,t.idx_tup_fetch 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; 

PoWA似乎是PostgreSQL 9.4+的一个有趣的工具。 它收集统计数据,将它们可视化,并build议索引。 它使用pg_stat_statements扩展名。

PoWA是PostgreSQL工作负载分析器,可收集性能统计信息,并提供实时图表和图表来帮助监视和调整PostgreSQL服务器。 它类似于Oracle AWR或SQL Server MDW。

这应该有助于: 实际的查询分析