在 Oracle 中,首先评估哪些子句类型?如果我有以下内容(假装....表示有效的表达式和关系名称),评估的顺序是什么?
SELECT ...
FROM .....
WHERE ........
GROUP BY ...........
HAVING .............
ORDER BY ................
我的印象是 SELECT 子句是最后评估的,但除此之外我一无所知。
在 Oracle 中,首先评估哪些子句类型?如果我有以下内容(假装....表示有效的表达式和关系名称),评估的顺序是什么?
SELECT ...
FROM .....
WHERE ........
GROUP BY ...........
HAVING .............
ORDER BY ................
我的印象是 SELECT 子句是最后评估的,但除此之外我一无所知。
选择列表不能总是最后评估,因为 ORDER BY 可以使用选择列表中定义的别名,因此必须在之后执行它们。例如:
SELECT foo+bar foobar FROM table1 ORDER BY foobar
我会说一般执行顺序可能是这样的:
GROUP BY 和 WHERE 子句可以在不改变结果的情况下交换,HAVING 和 ORDER BY 也可以。
实际上事情更复杂,因为数据库可以根据不同的执行计划重新排序执行。只要结果保持不变,执行的顺序无关紧要。
另请注意,如果为 ORDER BY 子句选择索引,则从磁盘读取行时,它们的顺序可能已经正确。在这种情况下,ORDER BY 子句根本没有真正执行。
这就是执行计划的用途。但是,一般来说,只有一种方法可以做到这一点。我暂时忽略优化:
优化可能会导致一些“偷看”以做出更好的决策(例如,在扫描表之前检查 WHERE 子句是个好主意 - 索引可能可用)。
我相信大多数 RDBMS 通过预先通过优化器来解决这个问题,该优化器基本上会重写查询以利用索引、删除冗余表达式等。然后使用这个优化的查询来实际构建执行计划。还有可能改变细节的并行性 - 但基本原理是相同的。
Oracle 查询处理顺序
下面是 SQL 查询处理顺序:
FROM
CONNECT BY
WHERE
GROUP BY
HAVING
SELECT
ORDER BY