首页 > 解决方案 > 改进此查询

问题描述

你知道是否有办法改进这个查询?

运行此查询的数据库非常大,返回结果可能需要很长时间。

我们在 field_1、field_2 和 state 上有索引

我们正在使用 Postgres

SELECT id
FROM a
WHERE 
(field_1 = 999 OR field_2 = 876) AND state IN ('finished', 'closed')
ORDER BY created_at desc

我得到的一个建议是将这个查询一分为二,然后删除“OR”。

另一个建议是添加一些“分页”

标签: sqlpostgresql

解决方案


这将很难像编写的那样进行优化。如果您将其表述为:

SELECT id
FROM ((SELECT a.*
       FROM a
       WHERE field_1 = 999 AND state IN ('finished', 'closed')
      ) UNION ALL
      (SELECT a.*
       FROM a
       WHERE field_2 = 876 AND state IN ('finished', 'closed') and field_1 <> 999
      )
     ) a
ORDER BY created_at desc;

然后 Postgres 可以为每个子查询使用不同的索引:

  • (field_1, state)
  • (field_2, state, field_1)

推荐阅读