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