首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 實現 SELECT TOP N 最佳寫法與效能比較

     編輯:Oracle 資料庫基礎

核心邏輯

Oracle 無 TOP 關鍵字,標準做法:內層排序 + 外層 ROWNUM 過濾。

標準範本

SELECT column_list
FROM   (SELECT column_list
        FROM   table_name
        ORDER  BY sort_column)
WHERE  ROWNUM <= N
ORDER  BY ROWNUM ASC;  -- 保證輸出順序 (可選)

實戰範例:取前 3 筆依名稱排序

-- 客戶表 customer(id, name) 有 11 筆資料
SELECT *
FROM   (SELECT * FROM customer ORDER BY name)
WHERE  ROWNUM <= 3
ORDER  BY ROWNUM ASC;

-- 結果:
-- ID  NAME
-- 08  eighth
-- 05  fifth
-- 01  first

Oracle 12c+ 現代寫法 (推薦)

SELECT *
FROM   customer
ORDER  BY name
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

優點:語法標準、可讀性高、優化器支援 FIRST_ROWS(n) 自動最佳化、可直接搭配綁定變數 OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY。

效能比較與避坑

寫法適用版本解析/執行計畫深分頁效能建議場景
ROWNUM 雙層巢狀全版本可能產生 COUNT STOPKEY 提前終止差 (需掃描至 OFFSET)舊版本維護、簡單前幾頁
OFFSET/FETCH12c+優化器原生支援,可推導 FIRST_ROWS仍差 (標準限制)新專案標準寫法
Keyset Pagination全版本WHERE id > :last_id ORDER BY id FETCH FIRST n極佳 (索引範圍掃描)大資料量、無限捲軸、API 分頁

Keyset Pagination 範例

-- 第一頁
SELECT * FROM customer ORDER BY customer_id FETCH FIRST 10 ROWS ONLY;
-- 記下最後一筆 customer_id = 100

-- 後續頁
SELECT * FROM customer
WHERE  customer_id > 100
ORDER  BY customer_id
FETCH FIRST 10 ROWS ONLY;

前提:排序欄位唯一且有索引 (主鍵最佳)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved