Postgresql性能-索引页点击率

Postgresql性能-索引页点击率,postgresql,performance,database-indexes,database-tuning,Postgresql,Performance,Database Indexes,Database Tuning,我运行以下查询来估计从rom内存读取的索引页(缓冲区命中)与从磁盘读取的索引页的比率 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_h

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

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;
选择
t、 schemaname,
t、 重新命名为“表名”,
io_i.indexrelname作为“索引名”,
当(io_i.idx_blks_达到0或io_i.idx_blks_读取0)然后
四舍五入(io_i.idx_blks_hit/(io_i.idx_blks_hit::numeric+
io_i.idx_blks_read::numeric),4)否则以“索引命中率”结尾
从…起
pg_统计_用户_表t
在io_i.relid=t.relid上加入pg_statio_user_索引io_i
按“指数命中率”说明排序;
我有几个指数,这个比率太低(低于0.7)。
请告知可能的原因以及如何改进。

共享缓冲区的大小不足以包含所有索引,因此查询会命中磁盘(或文件系统缓存,这是正常的)

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

如果可以将
shared_buffers
设置得足够高以包含整个数据库,请执行此操作。否则,它有一些设置
共享\u缓冲区的建议


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

共享\u缓冲区的大小不足以包含所有索引,因此查询会命中磁盘(或文件系统缓存,这是正常的)

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

如果可以将
shared_buffers
设置得足够高以包含整个数据库,请执行此操作。否则,它有一些设置
共享\u缓冲区的建议


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

非常感谢。您的建议非常有用,因为我们经常有高达100%的I/O利用率。非常感谢。您的建议非常有用,因为我们经常会有高达100%的I/O利用率。