數據庫分頁

MySql分頁

--page:當前頁   pageNum:每頁顯示條數   
select  * from goods e  limit 2,2;
select * from  goods e limit (page-1)*pageNum,pageNum;--MySql分頁公式,按照公式來,取值前開後閉:<   <=

Oracle分頁  

1. 第一種sql

--公式
--page:當前頁   pageNum:每頁顯示條數  
select *
  from (select stu.*, rownum rn
          from (select * from stu) stu
         where rownum <= (page-1)*pageNum+pageNum)
 where rn > (page-1)*pageNum; 

--具體例子
select *
  from (select stu.*, rownum rn
          from (select * from stu) stu
         where rownum <= 3)
 where rn >= 1;

2.第二種oracle

--公式
--page:當前頁   pageNum:每頁顯示條數  
 select *
   from (select stu.*, rownum rn from (select * from stu) stu)
  where rn > (page - 1) * pageNum
    and rn <= (page - 1) * pageNum + pageNum); --網上這裏用Between閉區間,我以爲不合適這個公式,這個公式要前開後閉

--具體例子
select *
  from (select stu.*, rownum rn from (select * from stu) stu)
 where rn <= 3
   and rn > 0;  

對比這兩種寫法,絕大多數的狀況下,第一種oracle分頁的效率比第二種高得多。對於Oracle推薦第一種優化

這是因爲CBO 優化模式下,Oracle能夠將外層的查詢條件推到內層查詢中,以提升內層查詢的執行效率。對於第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 3就能夠被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。而第二個查詢語句,因爲查詢條件rn <= 3 and rn > 0blog

是存在於查詢的第三層,而Oracle沒法將第三層的查詢條件推到最內層(即便推到最內層也沒有意義,由於最內層查詢不知道RN表明什麼)。所以,對於第二種查詢語句,Oracle最內層返回給中間層的是全部知足條件的數據,而中間層返回給最外層的也是全部數據。數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。it

相關文章
相關標籤/搜索