我有一个64GB RAM的服务器和PostgreSQL 9.2。它是一个只有4GB的小型数据库“A”,每小时只查询一次,一个大型数据库“B”,大约60GB,每秒查询40-50次!
正如预期的那样,Linux和PostgreSQL使用更大的数据库数据填充RAM,因为它经常被访问。
我现在的问题是对小型数据库“A”的查询很关键,必须在< 500ms内运行。日志文件每天显示几个查询,但是> 3s。如果我手工执行它们,它们也只需要10ms,所以我的索引很好。
所以我猜这些长跑者发生在PostgreSQL必须从磁盘加载小数据库索引块时。
我已经有了某种“缓存加热器”脚本,它每秒都会向“小型数据库”重复“SELECT * FROM x ORDER BY y”查询,但它会浪费大量的CPU能力,只会稍微改善一下情况。 / p>
如何告诉PostgreSQL我真的希望那个小型数据库在内存中“粘性”?
答案 0 :(得分:1)
PostgreSQL并没有提供一种在内存中固定表格的方法,尽管社区肯定会欢迎那些愿意进行深思熟虑,经过测试和基准测试的提案,以便允许那些愿意支持这些提案的人代码。
此时PostgreSQL的最佳选择是为响应时关键数据库运行单独的PostgreSQL实例。为此DB提供足够大的shared_buffers,整个数据库将驻留在shared_buffers
。
NOT 在ramdisk或其他非持久存储上创建表空间,并将那些需要不频繁但快速访问的数据放在那里。所有表空间必须是可访问的,否则整个系统将停止;如果丢失了表空间,则会有效地丢失整个数据库集群。