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.12和rails 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时间.好多了!
他们已经解决了这个问题,并围绕您发现的错误开了几张票:
https://github.com/jruby/jruby/issues/1662
https://github.com/jruby/activerecord-jdbc-adapter/issues/540
使用 Jruby 1.7.12 将性能提高约 5 倍(正如他们的基准测试所暗示的那样)
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |