首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于单个sql查询的rails-5 activerecord postgresql-9.6 enable_nestloop

用于单个sql查询的rails-5 activerecord postgresql-9.6 enable_nestloop
EN

Stack Overflow用户
提问于 2017-02-10 23:12:25
回答 1查看 351关注 0票数 1

对于activerecord中的单个查询,我尝试使用原始SQL打开并关闭postgresql enable_nestloop。这是命令

代码语言:javascript
复制
 class Segment < ApplicationRecord
   def self.count_payload_kind

     s = "

       SET LOCAL enable_nestloop = off;

       SELECT count(*)
       FROM   segments s
       WHERE  s.payload @> '[{\"kind\":\"person\"}]';

       SET LOCAL enable_nestloop = on;
     "

     ActiveRecord::Base.connection.execute(s).to_a

   end
 end

当我调用ActiveRecord::Base.connection.execute(s).to_a,时,它不会返回任何记录,也不会抛出错误。但是,如果删除对设置本地enable_nestloop的2次调用,则它将正确工作。

如何为一个查询打开和关闭enable_nestloop。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-13 23:03:30

通过在Rails 4.2.6和postgresql 9.5.4上的测试,将调用包装在事务中可能有效。

代码语言:javascript
复制
result = ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.execute("SET LOCAL enable_nestloop = off;")
  r = ActiveRecord::Base.connection.execute("
    SELECT count(*)
      FROM projects
     WHERE active;
  ")
  ActiveRecord::Base.connection.execute("SET LOCAL enable_nestloop = on;")
  r
end

result.values.flatten
=> ["1"]

SQL输出

代码语言:javascript
复制
(4.3ms)  BEGIN
(6.8ms)  SET LOCAL enable_nestloop = off;
(98.3ms)
  SELECT count(*)
    FROM projects
   WHERE active;

(3.1ms)  SET LOCAL enable_nestloop = on;
(3.0ms)  COMMIT
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42170182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档