PostgreSQL索引使用分析

PostgreSQL索引使用分析,sql,database-design,postgresql,Sql,Database Design,Postgresql,是否有工具或方法来分析Postgres,并确定应该创建哪些缺失的索引,以及应该删除哪些未使用的索引?我对SQLServer的“profiler”工具有一些经验,但我不知道Postgres中有类似的工具。关于确定缺失索引的方法……没有。但在未来的版本中,有一些计划可以让这变得更容易,比如伪索引和机器可读解释 目前,您需要解释分析性能不佳的查询,然后手动确定最佳路线。一些日志分析器可以帮助确定查询 对于未使用的索引,您可以使用以下内容来帮助识别它们: select * from pg_stat_al

是否有工具或方法来分析Postgres,并确定应该创建哪些缺失的索引,以及应该删除哪些未使用的索引?我对SQLServer的“profiler”工具有一些经验,但我不知道Postgres中有类似的工具。

关于确定缺失索引的方法……没有。但在未来的版本中,有一些计划可以让这变得更容易,比如伪索引和机器可读解释

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

对于未使用的索引,您可以使用以下内容来帮助识别它们:

select * from pg_stat_all_indexes where schemaname <> 'pg_catalog';
从模式名为“pg_目录”的pg_stat_all_索引中选择*;

这将有助于识别读取、扫描和获取的元组。

检查统计信息
pg_stat_user_表
pg_stat_user_索引
是开始的索引


请参阅“”。

有多个指向脚本的链接,可帮助您在站点上查找未使用的索引。基本技术是查看
pg_stat_user_索引
,并查找那些
idx_scan
,该索引用于回答查询的次数为零,或者至少非常低的索引。如果应用程序已更改,而以前使用的索引现在可能不存在,则有时必须运行
pg_stat_reset()
将所有统计信息恢复为0,然后收集新数据;您可以保存所有内容的当前值,然后计算一个增量来解决这个问题

目前还没有任何好的工具可以用来建议缺少索引。一种方法是记录正在运行的查询,并使用查询日志分析工具(如pgFouine或pqa)分析哪些查询运行时间较长。有关详细信息,请参阅“”

另一种方法是查看
pg_stat_user_表
,并查找对其进行大量顺序扫描的表,其中
seq_tup_fetch
较大。使用索引时,
idx\u fetch\u tup
计数反而会增加。当一个表的索引不够好,无法回答针对它的查询时,这可能会提示您


实际上是在搞清楚你应该在哪些列上建立索引?这通常会导致再次返回查询日志分析内容。

我喜欢这样来查找缺少的索引:

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 than 2%
      AND n_live_tup > 10000
      AND pg_relation_size(relname :: regclass) > 5000000
ORDER BY relname ASC;
这将检查序列扫描是否多于索引扫描。如果表很小,它就会被忽略,因为Postgres似乎更喜欢对它们进行序列扫描

上面的查询确实显示了缺少的索引

下一步是检测丢失的组合索引。我想这不容易,但可行。也许在分析那些慢查询。。。我听说可以帮助…

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

PoWA是PostgreSQL工作负载分析器,它收集性能统计数据并提供实时图表,以帮助监视和优化PostgreSQL服务器。它类似于Oracle AWR或SQL Server MDW


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


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


可以在postgres控制台中使用以下查询找到它

use db_name
select * from pg_stat_user_indexes;
select * from pg_statio_user_indexes;

有关更多详细信息,请将查询更改为:
选择relname,seq_scan-idx_scan AS too_much_seq,如果seq_scan-idx_scan>0,则选择“缺少索引”,否则选择“OK”结束,将pg_relation_size(relid::regclass)作为rel_size,seq_scan,从pg_stat_所有表格扫描idx_,其中schemaname='public'和pg_relation_size(relid::regclass)>80000,顺序太多\u seq DESC
到@cen的点,当
太多
是正数和大数时,你应该关心。我在其中一个表上创建了几个索引,但这个查询仍然显示该表上缺少的索引。@KishoreKumar我猜postgres中的统计信息仍然包含更新索引之前执行的查询。根据您的流量,统计数据在几个小时后会恢复正常。
::regclass
对大写标识符不起作用,@Muskrat先生有一个很好的解决方案,也可以使用
(“'”| | relname | |“)::regclass
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 
use db_name
select * from pg_stat_user_indexes;
select * from pg_statio_user_indexes;