确保rails查询生成正确的SQL

时间:2015-12-10 00:03:47

标签: ruby-on-rails ruby unit-testing

我的一位朋友让我查看他的网站,看看哪里出错了。有些东西花了很长时间(所以nginx返回502错误)。花了一些时间调试后,我发现了这个:

User.all.take(10)

我以前检查了回购,我在本地运行它,一切正常。问题是:他喜欢10m的用户,并且该查询将所有用户加载到内存中(而不是在数据库上进行分页)。

在修复某些内容之后,通常应该编写一个联合测试来确保错误不再出现。现在,我的问题是:

我怎样才能确保这样的事情不再发生?

2 个答案:

答案 0 :(得分:0)

如果您在function relativeComplement ( setB, cmp ) { var sharedSetB = setB.shareReplay(); return function ( setA ) { return Rx.Observable.forkJoin(setA.toArray(), sharedSetB.toArray(), function ( arrayA, arrayB ) { return relativeComplementArray(arrayA, arrayB, cmp); }) } } 之前使用Rails版本,则4.0.2方法的行为可能略有不同,因为take方法为not yet introduced take ActiveRecord::Relation 1}}。

它在4.0.2之前的行为方式是获取整个User.all数组并运行Ruby数组take方法从数组中获取10个元素,这些元素效率很低并导致{{1} }}。它会生成以下查询。

Bad Gateway

SELECT "users".* FROM "users" 中引入的新take方法更像是Rails 4.0.2方法的别名。它将生成以下查询

limit

因此,对于较旧的Rails版本,只需使用SELECT "users".* FROM "users" LIMIT 10 方法

limit

P.S。我假设您使用的是较旧的rails版本,因为这是对行为发生的最合乎逻辑的解释。此外,您的网站有1000万用户,所以它必须已经很长时间了。祝你好运。

答案 1 :(得分:0)

I recommend the gem, bullet.

https://github.com/flyerhzm/bullet

It helps to detect inefficient queries like N+1 query. It simply alerts on a browser when opening the page that calls such query.

And there are some configurations, please see:

https://github.com/flyerhzm/bullet#configuration

Hope it helps!