qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Oracle數據庫查詢高效分頁

            由于網頁渲染速度的影響,在C/S程序中那種一個Grid包含幾千、上萬行的數據基本上在網頁是無法展現的,因此一般采用分頁的形式顯示(也可能采用Visual Srolling方式加載的,企業應用系統的不是很常見),ASP.NET 的數據控件一般帶有分頁功能,3.5以后還提供了單獨的分頁控件,也有用過AspNetPager這個第三方的組件。

            分頁的控件實在很方便,以前的處理方式就是數據都拿出來,然后由控件進行處理,一般數據量不大的時候應該說感覺不出來優劣,但由于每次從數據庫取的時候都是取所有的數據,肯定會增加數據庫的壓力,傳輸的數據庫多了對網絡帶寬也會產生壓力的。很有可能查出來1萬條數據,最后顯示只用到啟用50條,翻頁的時候又重新去查1萬條數據,顯示之后的的又50條。

            以下的分頁SQL比較常見的,在SQL Server也有對應的使用TOP關鍵字的版本,記得剛學Oralce的時候就想著怎么不能rownum between minValue and maxValue的用法。與最初的疑惑的原理一樣,rownum是在查詢過程中生成的,因此以下的SQL其實是查出來5300行,然后扔掉了前面5000行,返回后面的300行。當然這種已經進了一大步的,由數據庫返回的數據變少的,只是當查詢的頁數比較大的時候,查詢還是存在一定的浪費。

          1. select * 
          2.   from (select a.*, rownum as rnum 
          3.           from (select * from yz_bingrenyz) a 
          4.          where rownum <=5300) 
          5.  where rnum >= 5000

            Linq提供了Skip和Take的API可以用于分頁,由于使用的是Entity Framework,在好奇的驅使下用EFProfiler查看生成的SQL,才知道這樣以下分頁更好。 主要就是使用了row_numer()over()這樣的分析函數,可以直接找到那第5000行開始的地方,然后在取出30行就行了。

          1. select * 
          2.   from (select * 
          3.           from (select t.*, 
          4.                        row_number() OVER(ORDER BY nullAS "row_number" 
          5.                   from yz_bingrenyz t) p 
          6.          where p."row_number" > 5000 
          7.         ) q 
          8.  where rownum <= 30

            比較分析:

            本機測試前者耗時1.3s,后者僅0.25s,從以下的執行計劃也能看出差異來。

            實際應用

            如果每次查詢都要寫這種SQL那肯定比較麻煩,可以采用存儲過程進行封裝,但由于要動態執行SQL,效率肯定又要打折扣,所以在ASP.NET中用C#封裝函數比較好,對于沒有使用實體框架的而用ADO.NET的,傳入表名 、主鍵名、頁數、要取的行數作為參數,用DBCommand進行執行返回結果即可。

          posted on 2012-07-25 10:04 順其自然EVO 閱讀(860) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鹿泉市| 祁东县| 灌阳县| 方山县| 宁南县| 盱眙县| 崇信县| 佳木斯市| 马山县| 叙永县| 武功县| 武邑县| 富民县| 望都县| 德安县| 襄樊市| 宁国市| 横峰县| 广东省| 汝南县| 抚松县| 南投县| 凤山市| 洪江市| 克山县| 托里县| 钟山县| 鄂伦春自治旗| 永州市| 霍城县| 淮北市| 贵南县| 聊城市| 镇巴县| 长子县| 霞浦县| 怀化市| 正阳县| 云梦县| 临颍县| 东兴市|