在pgAdmin中Rails查询速度很慢但速度很快

PaR*_*Nos 8 postgresql jruby ruby-on-rails-4

我想弄清楚为什么我的rails应用程序中的一个查询表现相当不错.我正在使用Postgres 9.3,并使用jRuby 1.7.10使用rails 4.0.3,这可能是JDBC驱动程序的一个问题?

但基本上,这是一个非常简单的查询:

SELECT * FROM table;
Run Code Online (Sandbox Code Playgroud)

该表包含851行,因此它几乎不是一个庞大的数据集,所以我期待快速查询.当我在pgAdmin 3中执行此查询时,我得到了我期望的结果:所有行返回15到35ms之间的任何位置.好快又快!

从轨道来看,这是一个不同的故事.在rails控制台中运行查询,我能够实现的最快速度189ms虽然一般都在200ms标记之内.此查询通过调用运行Table.all

我最初的想法只是ActiveRecord在851对象的实例化中增加了开销,所以这显然会减慢它的速度.为了测试这个,我跑了

ActiveRecord::Base.connection.execute("SELECT * FROM table")
Run Code Online (Sandbox Code Playgroud)

有一点点加速,但是,几乎所有的查询都在进行150ms,距离pgAdmin标记还有很长的路要走.作为我尝试的最后一次尝试

ActiveRecord::Base.connection.exec_query_raw("SELECT * FROM table")
Run Code Online (Sandbox Code Playgroud)

但这根本没有改善性能.

考虑到我看到pgAdmin和Rails之间的性能下降了10倍,我现在真的很难过为什么这么慢.在Rails中只执行了原始SQL,我知道ActiveRecord不会减慢速度,所以我现在真的很困惑.

有谁知道为什么这比它应该慢得多?

UPDATE

我已经做了一些挖掘,似乎是rails处理Date字段的方式.如果我手动选择表中的所有列,它同样慢,但如果我选择除了updated_at和之外的所有列created_at,查询运行大约2-4ms,这是完美的!

我现在唯一的问题是如何解决这个问题.有没有办法修复日期的rails性能问题,或者有轨道没有将它们解析为日期并将它们保存为字符串或类似的?

更新2

这样做后,一些挖掘和@stonehz指着我从这个职位上调的错误,我已经升级到了Jruby 1.7.12rails 4.1.0,发现有相当加快.它与pgAdmin的性能并没有太大关系,但我认为如果不完全删除日期列,我就不会得到更好的结果.以下是我现在得到的基准

SELECT *:                        4.080000   0.330000   4.410000 (  5.243000)
SELECT date_fields:              1.960000   0.020000   1.980000 (  2.032000)
SELECT * - date_fields:          3.070000   0.070000   3.140000 (  3.247000)
--------------------------------------------------------- total: 9.530000sec

                                     user     system      total        real
SELECT *:                        3.700000   0.060000   3.760000 (  4.663000)
SELECT date_fields:              1.790000   0.020000   1.810000 (  2.021000)
SELECT * - date_fields:          2.330000   0.060000   2.390000 (  3.180000)
Run Code Online (Sandbox Code Playgroud)

该基准测试查询851行.第一个测试是一个简单的SELECT *声明.第二个测试仅选择日期字段,最终测试选择日期字段之外的所有字段.每个查询都运行100次以获得最终结果.

如图所示,该select *语句现在只需要约4秒就可以运行100次,因此每个查询只占用40ms更接近〜30ms的pgAdmin时间.好多了!

sto*_*ehz 1

他们已经解决了这个问题,并围绕您发现的错误开了几张票:

https://github.com/jruby/jruby/issues/1662

https://github.com/jruby/activerecord-jdbc-adapter/issues/540

使用 Jruby 1.7.12 将性能提高约 5 倍(正如他们的基准测试所暗示的那样)