Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在pgAdmin中Rails查询速度慢但速度快_Postgresql_Ruby On Rails 4_Jruby - Fatal编程技术网

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

Postgresql 在pgAdmin中Rails查询速度慢但速度快,postgresql,ruby-on-rails-4,jruby,Postgresql,Ruby On Rails 4,Jruby,我试图弄清楚为什么我的rails应用程序中的一个查询的性能相当差。我在jRuby 1.7.10中使用Postgres 9.3和rails 4.0.3,所以JDBC驱动程序可能存在问题 但基本上,这是一个非常简单的查询: SELECT * FROM table; 该表包含851行,因此它几乎不是一个庞大的数据集,因此我期待一个快速查询。当我在pgAdmin 3中执行这个查询时,我得到的正是我所期望的:返回的所有行都在15到35毫秒之间。又快又好 然而,与rails不同的是。在rails控制台中运

我试图弄清楚为什么我的rails应用程序中的一个查询的性能相当差。我在jRuby 1.7.10中使用Postgres 9.3和rails 4.0.3,所以JDBC驱动程序可能存在问题

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

SELECT * FROM table;
该表包含
851
行,因此它几乎不是一个庞大的数据集,因此我期待一个快速查询。当我在pgAdmin 3中执行这个查询时,我得到的正是我所期望的:返回的所有行都在15到35毫秒之间。又快又好

然而,与rails不同的是。在rails控制台中运行查询时,我能达到的最快速度是
189ms
,而通常是
200ms
标记。此查询通过调用
表来运行。all

我最初的想法很简单,ActiveRecord在851个对象的实例化中增加了开销,所以这显然减慢了它的速度。为了测试这一点,我运行了

ActiveRecord::Base.connection.execute("SELECT * FROM table")
有一点加速,但同样,几乎所有的查询都在
150ms左右
,距离pgAdmin标记还有很长的路要走。作为最后一次尝试,我试了一下

ActiveRecord::Base.connection.exec_query_raw("SELECT * FROM table")
但这根本没有改善性能

考虑到pgAdmin和Rails之间的性能下降了10倍,我现在真的很难理解为什么速度会慢得多。在Rails中只执行了原始SQL之后,我知道这并不是ActiveRecord减慢了速度,所以我现在真的很困惑到底是什么

有人知道为什么这比应该的慢很多吗

更新

我做了更多的挖掘,这似乎是rails处理日期字段的方式。如果我手动选择表中的所有列,速度也一样慢,但是如果我在处选择所有列(除了
updated\u和
created\u,在
处),查询运行大约2-4ms,这是完美的

我现在唯一的问题是,如何避开这个问题。有没有办法解决rails在日期方面的性能问题,或者让rails不将其解析为日期并将其保留为字符串或类似内容

更新2

因此,在做了更多的挖掘和@stonehz向我指出本文中提出的bug之后,我升级到了
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)
此基准测试正在查询851行。第一个测试是一个简单的
SELECT*
语句。第二个测试只选择日期字段,最后一个测试选择除日期字段之外的所有字段。每个查询运行100次以获得最终结果

如图所示,
select*
语句现在只需约4秒即可运行100次,因此每个查询只需
40ms
,这更接近于约30ms的pgAdmin时间。好多了

考虑到pgAdmin和Rails之间的性能下降了10倍,我现在真的很难理解为什么速度会慢得多。在Rails中只执行了原始SQL之后,我知道这并不是ActiveRecord减慢了速度,所以我现在真的很困惑到底是什么

它不是ActiveRecord,而是您的查询

当您在pg admin中运行这个查询时,据我所知,它实际上并没有运行它。PgAdmin对您的使用做了一些假设,即您经常会得到一个庞大的集合。为了提高性能,更有趣的是使用光标,以便允许您通过根据需要获取行来导航庞大的集合,而不是一次获取所有行。我想这正是正在发生的事情


相反,当你在你的应用程序中运行相同的查询时,你要负责做这类事情。或者,就这一点而言,首先不要运行这种查询。需要从数据库表中选择所有行通常表明应用程序的设计有问题。

他们已经解决了这个问题,并针对您发现的错误提出了几项建议:


使用Jruby 1.7.12可以将性能提高5倍左右(正如他们的基准测试所暗示的)

我不是ruby on rails的人,但我只想选择*我可以说,你应该从只命名你需要的列开始。ORM经常通过一个完整的狗和小马表演把*变成一堆名字,而不是什么,这可能会在你们的总时间中增加一些ms。为了进行快速实验,您可以从表中选择1个my_编号并查看其执行情况吗?Rails对查询没有任何技巧,它只运行SELECT*,而不将其更改为单个列SELECT。在生产模式下,它似乎确实加快了一点,但没有我预期的那么快。如果从rails控制台运行查询,您仍然在添加另一层,该层添加了一行行代码来处理并从数据库返回结果集。我的意见是,我希望它在某种程度上会变慢,而154ms的速度听起来并不合理。Pgadmin是用C++编写的,我希望它能更好地处理显示结果集。从psql运行相同的查询,我打赌它将击败pgadmin,或者在更糟糕的情况下匹配它。我的观点是Ruby/Rails/Active record的速度慢了,而不是Postgres。在所有的生产查询中去掉SELECT*(plz:)。嗯,好的,我们会做更多的测试。别担心,我实际上还没有在生产代码中加入SELECT*!这只是rails为特定用例自动生成的查询。没有硬编码的查询我发现这个问题是在寻找完全相反的问题。rails中的半复杂查询是39ms,PgAdmin中是1729ms。更新到Jruby 1.7.12和更新rails到4.1.0肯定会提高速度。我用更多的结果更新了这个问题,但我认为这是在不完全排除日期的情况下我能得到的最接近的结果