Postgresql性能 - 索引页面命中

时间:2017-10-02 15:47:38

标签: postgresql performance database-indexes database-tuning

我运行以下查询来估计读取内存(缓冲区命中)的索引页与从磁盘读取的索引页的比率

select
    t.schemaname, 
    t.relname as "Table Name", 
    io_i.indexrelname as "Index Name", 
    case when (io_i.idx_blks_hit <> 0 or io_i.idx_blks_read <> 0) then 
    round(io_i.idx_blks_hit/(io_i.idx_blks_hit::numeric + 
    io_i.idx_blks_read::numeric), 4) else null end as "Index Hit Ratio" 
from 
    pg_stat_user_tables t
    join pg_statio_user_indexes io_i on io_i.relid = t.relid 
order by "Index Hit Ratio" desc;

我有几个指数,这个比率太低(低于0.7)。 请告知可能的原因以及如何改进它。

1 个答案:

答案 0 :(得分:1)

shared_buffers不足以包含所有索引,因此查询命中磁盘(或文件系统缓存,这没关系)。

可能这些索引不经常使用,因此PostgreSQL不要让它们缓存是有意义的。检查idx_scan视图中的pg_stat_user_indexes,查看自上次统计信息重置以来扫描索引的频率。

如果您可以将shared_buffers设置得足够高以包含整个数据库,请执行此操作。否则,read the manual有一些设置shared_buffers的建议。

除此之外,只要性能良好且I / O系统没有过载,我就不会做任何事情。如果您遇到问题,请尝试获取更多内存。如果该选项用尽,请加快存储速度。