2

我有一台 64GB RAM 和 PostgreSQL 9.2 的服务器。上面有一个只有 4GB 的小型数据库“A”,大约每小时查询一次,还有一个大约 60GB 的大数据库“B”,每秒查询 40-50 次!

正如预期的那样,Linux 和 PostgreSQL 用更大的数据库数据填充 RAM,因为它被更频繁地访问。

我现在的问题是对小型数据库“A”的查询很关键,必须在 <500 毫秒内运行。日志文件显示了每天需要超过 3 秒的查询。如果我手动执行它们,它们也只需要 10 毫秒,所以我的索引很好。

所以我猜想,当 PostgreSQL 必须从磁盘加载小型数据库索引的块时,就会发生这些长跑者。

我已经有某种“缓存预热器”脚本,它每秒对小型数据库重复“SELECT * FROM x ORDER BY y”查询,但它浪费了大量的 CPU 能力,只会稍微改善一下情况。

还有更多想法如何告诉 PostgreSQL 我真的希望那个小型数据库“粘”在内存中吗?

4

1 回答 1

1

PostgreSQL 不提供将表固定在内存中的方法,尽管社区肯定会欢迎那些愿意从事深思熟虑、经过测试和基准测试的提议的人,以允许那些愿意用真实代码支持这些提议的人这样做。

此时使用 PostgreSQL 的最佳选择是为响应时间关键型数据库运行单独的 PostgreSQL 实例。给这个数据库一个足够大的 shared_buffers 整个数据库将驻留在shared_buffers.

不要在 ramdisk 或其他持久存储上创建表空间,并将需要不经常但快速访问的数据放在那里。所有表空间都必须是可访问的,否则整个系统将停止;如果你丢失了一个表空间,你实际上会丢失整个数据库集群。

于 2013-07-18T02:02:37.270 回答