为什么PostgreSQL查询在服务器启动后的第一个请求中比在后续请求期间慢?

时间:2012-10-15 20:34:46

标签: ruby-on-rails postgresql postgresql-performance

我正在使用PostgreSQL 9.1.1和Rails 3.2.8。使用NewRelic的开发模式我注意到在我的服务器启动或重启后的第一个请求期间,与后续请求期间相比,几个SQL查询需要更长的时间。

是否有任何理由,这是由于准备好的陈述?

2 个答案:

答案 0 :(得分:5)

刚启动后,没有任何索引加载到内存中,因此服务器必须执行大量非常慢的磁盘读取。随着活动的进行,越来越多的索引页面被加载到内存中,咨询这些页面当然要快得多。

答案 1 :(得分:0)

您的服务器托管在哪个操作系统上?在Linux中,文件系统使用RAM缓存来存储文件。当需要打开新文件时,如果有空间,则将其存储在缓存中。如果没有空间,则删除最旧/最后访问的文件以为新文件腾出空间。 PostgreSQL将关系(表和索引)存储为文件。首次读取它们时,Linux文件系统会将它们加载到内存中。这使得访问数据的速度更快。但是初始读取的开销是"慢"你正在经历的。随后的数据读取直接来自RAM - 除非缓存交换。

根据我的经验,您应该监控表和索引的大小。如果它们变得太大,那么来自一个这样的"怪物表的单个查询"可以导致所有其他常用文件换出缓存,整个系统都会受到影响。让你的表更小(如果你在一百万行的范围内尝试分区),并且不要在高度精确的字段(如时间戳)上进行索引 - 而是在日期索引 - 你将拥有更少的索引节点,因此较小的索引文件(假设您每天都有很多记录)。这将允许操作系统更有效地加载和关闭缓存中的关系,并且您不会太注意速度差异。

如果您在Windows上托管,则可能无法解释您的性能问题。如果您需要说服移动到* nix服务器,您应该认真阅读PostgreSQL关于性能的文档。