我正在使用 PostgreSQL 14.6,我的目标是找出是否有更简单、更快的方法来实现相同的结果,但仍然使用类似的 UNION 查询。
这是我要优化的 SQL 语句:
SELECT hyobjects_id, hyobjects_globalpriority
FROM hyobjects, hyobjectypes, actionlltypes
WHERE hyobjects_hyobjectypes = hyobjectypes_id
AND hyobjectypes_actionlltypes = actionlltypes_id
AND actionlltypes_id = 1
UNION
SELECT hyobjects_id, hyobjects_globalpriority
FROM hyobjects, actionstatuses, actionlltypes
WHERE actionstatuses_id = hyobjects_actionstatuses
AND actionstatuses_actionlltypes = actionlltypes_id
AND actionlltypes_id = 1
EXCEPT
SELECT hyobjects_id, hyobjects_globalpriority
FROM hyobjects, actionstatuses, actionlltypes
WHERE hyobjects_actionstatuses = actionstatuses_id
AND actionstatuses_actionlltypes = actionlltypes_id
AND actionlltypes_id = 2
UNION
SELECT hyobjects_id, hyobjects_globalpriority
FROM hyobjects, hyobjectypes, actionstatuses, actionlltypes
WHERE hyobjects_hyobjectypes = hyobjectypes_id
AND hyobjectypes_actionlltypes = actionlltypes_id
AND actionlltypes_id = 1
AND hyobjects_actionstatuses = 1
ORDER BY hyobjects_globalpriority DESC
表中的哪里actionlltypes
有actionlltypes_id = 1
什么意思ACTIVE
,actionlltypes_id = 2
什么意思INACTIVE
。
以及列hyobjectypes_actionlltypes
引用actionlltypes
和列hyobjects_actionstatuses
引用的位置actionlltypes
。我需要的结果actionstatuses_id
可能是 1 或有actionlltypes_id = 1
.
我鼓励您尽可能地在查询中学习/使用 ANSI 连接
查看列名并完全猜测事物如何使用 ANSI 连接链接在一起可能如下所示:
需要注意的一件事是在第四个查询中,似乎没有任何列将 actionstatuses 表连接到其他任何东西,从而导致交叉连接。这是故意的,还是意外?
查看第一个查询:
这相当于
如果且仅当我对事物结构和列命名的猜测是正确的,那么结果中只有两列来自 hyobjects 表,不是吗?如果是这样,那么是否需要加入 hyobjecttypes 和 actionlltypes 表?如果是这样,那么第一个查询应该减少为:
第二个查询可以减少
到
查询三
成为
并查询四
可能成为
将它们放在一起可能会导致
但是,这纯粹是基于我对表名和列名的解释的推测。
现在,您要实际优化的内容尚不清楚,所以我会在这里停止......
感谢所有的好指针和参考。我一直在学习和尝试。
我的原始语句运行良好,只是有点慢。
EXPLAIN ANALYZE
给我以下UNION
基于陈述的结果:通过查看这里技术人员的答案,我得出了这个结果:
它以以下速度给我相同的结果: