淺談Oracle與Mysql分頁查詢比較!!!!

現在普遍同的數據庫無非就是Oracle和MySQL,在這裏作爲一個初學者總結一下Oracle和MySQL分頁查詢的實現與他們之間 的優缺點

個人覺得MySQL的分頁查詢方式一樣適合Oracle的查詢方式,只要看編者怎麼自定義自己的Page類,我以一個初學者的體驗覺得創建Page泛型類更適合初學者,簡單明瞭,注重要的是容易理解。下面不多說來看看兩者分頁查詢的實現:

               

Oracle分頁查詢:

                  sql查詢語句關鍵字:  runnum    
                  Oracle兩種分頁查詢:
                                                    ①SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
                               註解:其中最內層的查詢SELECT * FROM TABLE_NAME表示不進行翻頁查詢語句,ROWNUM <= 40 ) WHERE RN >= 21控制分頁查詢每頁的範圍
                                     第二層用來控制分頁查詢的最大值,最外層用來控制分頁查詢的最小值
                             SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40
            對比這兩種寫法,絕大多數的情況下,第一個查詢的效率比第二個高得多。

 

這是由於CBO優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。
 
而第二個查詢語句,由於查詢條件BETWEEN 21 AND 40是存在於查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因爲最內層查詢不知道RN代表什麼)。因此,對於第二個查詢語句,Oracle最內層返回給中間層的是所有滿足條件的數據,而中間層返回給最外層的也是所有數據。數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。
 
上面分析的查詢不僅僅是針對單表的簡單查詢,對於最內層查詢是複雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。
 
這裏就不對包含排序的查詢進行說明了,下一篇文章會通過例子來詳細說明。下面簡單討論一下多表聯合的情況。對於最常見的等值表連接查詢,CBO一般可能會採用兩種連接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不會考慮)。在這裏,由於使用了分頁,因此指定了一個返回的最大記錄數,NESTED LOOP在返回記錄數超過最大值時可以馬上停止並將結果返回給中間層,而HASH JOIN必須處理完所有結果集(MERGE JOIN也是)。那麼在大部分的情況下,對於分頁查詢選擇NESTED LOOP作爲查詢的連接方法具有較高的效率(分頁查詢的時候絕大部分的情況是查詢前幾頁的數據,越靠後面的頁數訪問機率越小)。



分頁查詢實體類及方法:
     實體類屬性:當前頁currentPage、總頁數totalPage、每頁顯示條數pageSize、總行數totalRows、顯示開始位置startNum、顯示結束位置endIndex、下一頁nextPage、上一頁previousPage、
查詢記錄數queryRecordSize、是否有下一頁hasNextPage 、是否有上一頁hasPreviousPage
            
      實體類方法: 重編頁碼repaginate()
                          1.計算總頁數
                                       if:如果查詢數據的總行數%每頁顯示數據條數爲0,則總頁數等於查詢數據的總行數/每頁顯示數據條數
                      else:如果查詢數據的總行數%每頁顯示數據條數爲0,則總頁數等於查詢數據的總行數/每頁顯示數據條數+1   注:當查詢條數爲12,每頁顯示的數據條數爲10。則此時的頁數應該數2
                          2.判斷是否有下一頁
                                       if:噹噹前頁碼大於或等於總的頁數,則是、此時沒有下一頁且當前頁碼爲總頁數,否則有下一頁
                          3.判斷是否有上一頁
                                        if:噹噹前頁<=1時,也就是當前頁是首頁,則沒有上一頁,當前頁碼數爲1,否則有上一頁
                          4.計算分頁查詢每頁開始的位置
                                        if:如果當前頁爲首頁,則從下表爲0開始查詢  否則查詢開始位置爲  (當前頁面數-1)*每頁顯示總數-1  
                          5.計算分頁查詢每頁結束的位置
                                       注:分三種情況    1.當前頁是首頁   2.當前頁是最後一頁   3.當前頁是中間頁
                          當前頁是中間頁   結束位置爲當前頁碼數*每頁顯示條數
                          當前頁是最後一頁    開始位置爲(當前頁面數-1)*每頁顯示總數     結束位置爲查詢數據總條數
                          當前頁爲首頁      結束位置爲每頁顯示條數
                          6.下一頁頁碼加1     噹噹前頁是尾頁     沒有下一頁
                          7.上一頁頁碼減1     //當前頁爲首頁   沒有上一頁
                          8.設置顯示開始位置     開始位置=每頁顯示條數*(當前頁碼-1)+1
                          9.設置顯示結束位置     結束位置=每頁顯示條數*當前頁碼


Mysql分頁查詢:
                         sql查詢關鍵字: limit 參數一,參數二
                         註解:參數一是開始查詢的位置、參數二是從參數一+1條數據開始查詢參數二條數據

sql查詢語句:
                         select *    from table_name limit   m,n

實體類屬性:當前頁碼pageNo、泛型分鐘實體類集合list、每頁顯示條數pageSize、總頁數totalItemNumber、

實體類方法



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