sql - 改进此查询
问题描述
你知道是否有办法改进这个查询?
运行此查询的数据库非常大,返回结果可能需要很长时间。
我们在 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”。
另一个建议是添加一些“分页”
解决方案
这将很难像编写的那样进行优化。如果您将其表述为:
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)
推荐阅读
- c# - WMI 查询不更新
- c# - 数据库如何为 Windows 开发工作?
- php - 如何用一些值增加变量并重新排序结果
- php - Same Technic 无法更新和删除 while 循环记录
- firebase - VueJS + Firebase Auth + Route Guards - 同步问题/竞争条件
- python - 无法获取属性“Word2VecKeyedVectors”
- .net - 将“obj”向下转换为没有类型注释的底层数组类型
- scala - 如何在 Scala 中选择性地调用函数
- php - 将 WebSocket (socketo.me) 连接到托管服务器时出现问题
- lambda - 评估 lambda 演算:if false false true