ORACLE 分頁查詢SQL

1. 根據 ROWID 來分

SELECT * FROM t_xiaoxi WHERE rowid IN(
	SELECT rid FROM (
		SELECT rownum rn,rid FROM(
			SELECT rowid rid,cid FROM t_xiaoxi  ORDER BY cid DESC
		) WHERE rownum<10000
	) WHERE rn>9980
) ORDER BY cid DESC;
 

執行時間0.03秒

 

2.按分析函數來分

select * from (
	select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t
) where rk<10000 and rk>9980;
 

執行時間1.01秒

 

3.按ROWNUM來分

select * from(
	select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000
) where rn>9980;

 執行時間0.1秒

 

 

其中t_xiaoxi爲表名稱,cid爲表的關鍵字段,取按CID降序排序後的第9981-9999條記錄,t_xiaoxi表有70000多條記錄
個人感覺1的效率最好,3次之,2最差

 

SELECT *
FROM   (SELECT a.*,
               rownum rn
        FROM   (SELECT *
                FROM   oc a
                ORDER  BY k001) a
        WHERE  ROWNUM <= 20)
WHERE  rn >= 10 AND rn < 20;
--此處之所以在外面包了一層,是因爲 ROWNUM不能像rn一樣加條件,只有用裏面 SQL檢索出的結果集才能分頁



SELECT b.*
FROM   (SELECT *
        FROM   (SELECT a.*,
                       rownum rn
                FROM   (SELECT ROWID rid,
                               status
                        FROM   product a
                        WHERE  company_id = ?
                        ORDER  BY status) a
                WHERE  rownum <= 20)
        WHERE  rn > 10 ) a,
       product b
WHERE  a.rid = b.rowid;
--用rowid的方式分頁效率比單純用 rownum的效率要高

 

 

另外加一條:

 

Oracle中複製一張表

 

create table table_name as ( select * from table )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章