簡體   English   中英

限制 oracle 子查詢時會發生什么

[英]What happens when limiting an oracle subquery

我和我的一個朋友最近就這個問題進行了辯論,所以我想知道這里是否有人真的知道答案。

Generally, to emulate the LIMIT start_index,result_count syntax of MySQL and the LIMIT result_count OFFSET start_index functionality of MySQL and PostgreSQL in Oracle, we use:

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;

需要使用此替代方法,而不是明確限制 function。 (如果有更好的方法,請告訴我)

我們中的一個人爭辯說,這意味着 Oracle 實際上獲取 END_INDEX 記錄,然后只返回那些 rn 超過 START_INDEX 的記錄。 這意味着在查找記錄 123,432-123,442 Oracle 時將檢索 123,431 條不必要的記錄。 然后有人爭辯說,暗示提到的兩個開源數據庫(MySQL和PgSQL)有一種捷徑可走。

反駁的論點是 DBMS 已針對處理子查詢進行了優化,這意味着語法不一定暗示行為。 此外,LIMIT 語法很可能只是語法糖,它們實際上是對 Oracle 中必須明確說明的內容的包裝。

有沒有人可以確定哪些是正確的解釋? 也許兩者在某種程度上都是正確的?

Oracle處理END_INDEX 行並將第 1 行丟棄到 START_INDEX-1 是正確的,但它只獲取cursor 中的行 START_INDEX 到 END_INDEX。

我不知道 LIMIT 是如何在其他 DBMS 中實現的,但我無法想象他們會怎么做:他們怎么知道他們正在獲取結果集的第 123,432 行而不首先找到並丟棄之前的 123,431 行?

在實踐中,如果您發現自己應用了一個 START_INDEX 超過數百個的 LIMIT 子句(或 Oracle 等效項),那么您確實需要重新考慮您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM