相关疑难解决方法(0)

保持PostgreSQL有时选择错误的查询计划

使用PostgreSQL 8.4.9,我对查询的PostgreSQL性能有一个奇怪的问题.此查询正在选择3D卷中的一组点,使用a LEFT OUTER JOIN添加相关ID列,其中存在相关ID.x范围的微小变化可能导致PostgreSQL选择不同的查询计划,执行时间从0.01秒到50秒.这是有问题的查询:

SELECT treenode.id AS id,
       treenode.parent_id AS parentid,
       (treenode.location).x AS x,
       (treenode.location).y AS y,
       (treenode.location).z AS z,
       treenode.confidence AS confidence,
       treenode.user_id AS user_id,
       treenode.radius AS radius,
       ((treenode.location).z - 50) AS z_diff,
       treenode_class_instance.class_instance_id AS skeleton_id
  FROM treenode LEFT OUTER JOIN
         (treenode_class_instance INNER JOIN
          class_instance ON treenode_class_instance.class_instance_id
                                                  = class_instance.id
                            AND class_instance.class_id = 7828307)
       ON (treenode_class_instance.treenode_id = treenode.id
           AND treenode_class_instance.relation_id = 7828321)
  WHERE treenode.project_id = 4
    AND (treenode.location).x >= 8000
    AND (treenode.location).x <= (8000 + 4736) …
Run Code Online (Sandbox Code Playgroud)

database postgresql performance sql-execution-plan postgresql-performance

25
推荐指数
2
解决办法
2万
查看次数

如何在带有Rails的WHERE子句中使用ANY而不是IN?

我曾经有过如下查询:

MyModel.where(id: ids)
Run Code Online (Sandbox Code Playgroud)

哪个生成sql查询如:

SELECT "my_models".* FROM "my_models"
WHERE  "my_models"."id" IN (1, 28, 7, 8, 12)
Run Code Online (Sandbox Code Playgroud)

现在我想改为使用ANY而不是IN.我创造了这个:

MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"
Run Code Online (Sandbox Code Playgroud)

现在,当我使用空数组时,ids = []我得到以下错误:

MyModel Load (53.0ms)  SELECT "my_models".* FROM "my_models"  WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages"  WHERE (id = ANY(VALUES()))
    from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'
Run Code Online (Sandbox Code Playgroud)

sql postgresql activerecord ruby-on-rails-3 ruby-on-rails-4

11
推荐指数
1
解决办法
1万
查看次数