【发布时间】:2011-05-25 09:20:54
【问题描述】:
我和我的一个朋友最近就这个问题进行了辩论,所以我想知道这里是否有人真的知道答案。
通常,为了在 Oracle 中模拟 MySQL 的 LIMIT start_index,result_count 语法和 MySQL 和 PostgreSQL 的 LIMIT result_count OFFSET start_index 功能,我们使用:
SELECT P.* FROM
( SELECT COL1...COLN, ROW_NUMBER() OVER ID_COLUMN AS RN FROM MY_TABLE )
WHERE P.RN BETWEEN START_INDEX AND END_INDEX;
需要使用这种替代方法,而不是显式限制函数。 (如果有更好的方法,请告诉我)
我们中的一个人争辩说,这意味着 Oracle 实际上会获取 END_INDEX 记录,然后只返回那些 rn 超过 START_INDEX 的记录。这意味着在查找记录 123,432-123,442 时,Oracle 将检索 123,431 条不必要的记录。然后有人争辩说,暗示提到的两个开源数据库(MySQL 和 PgSQL)有一种捷径。
反驳的论点是 DBMS 已针对处理子查询进行了优化,这意味着语法不一定暗示行为。此外,LIMIT 语法很可能只是语法糖,它们实际上是对必须在 Oracle 中明确说明的内容的包装。
有没有人可以确定哪些是正确的解释?也许两者在某些方面都是正确的?
【问题讨论】:
标签: mysql oracle postgresql