我使用下面的脚本查找丢失的索引,但是对它进行了任何修改,以查找和创建索引创建语句或查找我们可以使用哪一列进行索引?
数据库:Postgres
SELECT
relname AS TableName
,seq_scan-idx_scan AS TotalSeqScan
,CASE WHEN seq_scan-idx_scan > 0
THEN 'Missing Index Found'
ELSE 'Missing Index Not Found'
END AS MissingIndex
,pg_size_pretty(pg_relation_size(relname::regclass)) AS TableSize
,idx_scan AS TotalIndexScan
FROM pg_stat_all_tables
WHERE schemaname='public'
AND pg_relation_size(relname::regclass)>100000
ORDER BY 2 DESC;
我认为该查询不是很有用。
更好的是
SELECT relname,
seq_scan,
seq_tup_read / seq_scan AS tup_per_scan
FROM pg_stat_user_indexes
WHERE seq_scan > 0;
如果第二和第三列都很大,则缺少索引。
我认为“ pg_stat_all_tables”中的任何内容都不能告诉您索引中可能缺少表的哪些列。我通常建议使用慢速查询日志(auto_explain)来标识可能需要索引的查询,而不是pg_stat_all_tables来标识可能需要索引的查询。这样,查询的性质通常会使该列变得明显。如果要查看是否使用特定的索引,可以尝试hypopg,但需要指定列,它不会为您选择它们。