高效分頁的SQL技巧(以Oracle為例)

來源:互聯網
上載者:User

一般的分頁寫法大概就是下面的樣子所謂的“三層嵌套”寫法)

 
  1. SELECT *  
  2. FROM   (SELECT a.*  
  3.               ,rownum rn  
  4.         FROM   (SELECT * FROM table_name) a  
  5.         WHERE  rownum <= 40)  
  6. WHERE  rn >= 21 

在遇到顯示資料表中1百萬行以後的記錄時,可能會出現效能問題。有人提出的解決方案是利用索引,首先通過掃描索引查出rowid,然後再通過rowid查出所需記錄。這樣做的問題是如果沒有索引怎麼辦?以Oracle為例,下面是一個更具有一般意義的高效寫法:

 
  1. SELECT *  
  2. FROM   <your table name> t  
  3. WHERE  ROWID IN (SELECT rwd  
  4.                  FROM   (SELECT t.rowid rwd  
  5.                                ,rownum  n  
  6.                          FROM   <your table name> t  
  7.                          WHERE  rownum <= 1000000 + 10)  
  8.                  WHERE  n >= 1000000) 

最佳化的思想是跳到第1百萬位置時只是掃描了rowid,避免了掃描全部欄位。當欄位個數較多時,速度會有十倍的提升。本例在普通的裝置上運行不到1秒就出來結果了。這一方法在千萬級或億級仍然存在問題,其原因在於迴圈次數並未減少。如果真有rwd這樣一個欄位,那麼通過索引和分區等手段,也能夠確保速度。不過,話又說回來,分頁顯示成百上千萬條記錄這樣的事情,其欲達到的業務目的本身可否有更好的解決之道呢?

本文出自 “iData” 部落格,請務必保留此出處http://idata.blog.51cto.com/4581576/1121453

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.