我正在使用大型Rails应用程序从MySQL迁移到Postgres,大多数操作都以正常速率运行。但是,我们有一个特定的操作,每30分钟左右就会生成一份作业记录。通常会生成并插入大约200条记录,之后我们会有单独的工作人员从另一台服务器上获取作业并对其进行处理。
在MySQL下,生成记录大约需要15秒,然后另外3分钟让工作人员执行并一次一个地写回结果(因此原始作业记录会有200多次更新)。
在Postgres下大约需要30秒,然后是另外7分钟让工作人员执行并回写结果。
正在写入的表大约有200万行,ID下有1个序列列。
我试过调整检查点超时和大小没有运气。
该表格被大量索引,并且实际上不应该与以前有任何不同。
我无法将代码示例发布为庞大的代码库,并且无需发布代码页和代码页就没有意义。
我的问题是,有谁能想到为什么会发生这种情况? Postgres日志中没有任何内容,创建这些对象的过程并没有真正改变。是否存在某种阻塞同步写入行为我对Postgres不了解?
我已经在我的代码中添加了各种日志记录来发现错误或交易失败,但我没有提出任何问题,只需要两倍的时间来运行,这看起来并不正确对我来说。
Postgres实例在M3.Medium实例类型的AWS RDS上托管。
我们也使用New Relic,它在这里没有任何兴趣,这是令人惊讶的
答案 0 :(得分:1)
为什么您的作业队列包含200万行?它们是否存在或者没有将它们移动到存档表中以使报告更简单?
您是否在psql提示符或首选SQL IDE /工具上使用了EXPLAIN?
Postgres是一个与MySQL完全不同的RDBMS。它以不同方式分配空间并以不同方式操纵空间,因此可能需要以不同方式编制索引。
另外还有一个名为pgtune的工具会建议配置更改。
编辑:2014-08-13
此外,rails comes with a profiler可能会增加一些见解。这是StackOverflow thread about rails profiling。
您还希望在磁盘IO级别上查看数据库服务器。您的工作是否满足大量更新? Postgres在更新现有行时创建了新行,并将旧行标记为可用,而不是仅覆盖现有行。因此,您可能会因为RDBMS切换而看到更多IO。