J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

          三種SQL分頁法

          Posted on 2009-11-10 11:20 xcp 閱讀(2330) 評論(2)  編輯  收藏 所屬分類: Database

          三種SQL分頁法
          表中主鍵必須為標識列,[ID] int IDENTITY (1,1)

          1.分頁方案一:(利用Not In和SELECT TOP分頁)

          語句形式: 
          SELECT TOP 頁記錄數量 *
          FROM 表名
          WHERE (ID NOT IN
            (SELECT TOP (每頁行數*(頁數-1)) ID
             FROM 表名
             ORDER BY ID))
             ORDER BY ID
          //自己還可以加上一些查詢條件


          例:
          select top 2 *
          from Sys_Material_Type
          where (MT_ID not in
              (select top (2*(3-1)) MT_ID from Sys_Material_Type  order by MT_ID))
          order by MT_ID

           

          2.分頁方案二:(利用ID大于多少和SELECT TOP分頁)

          語句形式:
          SELECT TOP 每頁記錄數量 *
          FROM 表名
          WHERE (ID >
                    (SELECT MAX(id)
              FROM (SELECT TOP 每頁行數*頁數 id   FROM 表
                     ORDER BY id) AS T)
                 )
          ORDER BY ID

          例:
          SELECT TOP 2 *
          FROM Sys_Material_Type
          WHERE (MT_ID >
                    (SELECT MAX(MT_ID)
                     FROM (SELECT TOP (2*(3-1)) MT_ID
                           FROM Sys_Material_Type
                           ORDER BY MT_ID) AS T))
          ORDER BY MT_ID

           

          3.分頁方案三:(利用SQL的游標存儲過程分頁)
          create  procedure SqlPager
          @sqlstr nvarchar(4000), --查詢字符串
          @currentpage int, --第N頁
          @pagesize int --每頁行數
          as
          set nocount on
          declare @P1 int, --P1是游標的id
           @rowcount int
          exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
          select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁
          set @currentpage=(@currentpage-1)*@pagesize+1
          exec sp_cursorfetch @P1,16,@currentpage,@pagesize
          exec sp_cursorclose @P1
          set nocount off

           

          4.總結:
          其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
          建議優化的時候,加上主鍵和索引,查詢效率會提高。

          通過SQL 查詢分析器,顯示比較:我的結論是:
          分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
          分頁方案一:(利用Not In和SELECT TOP分頁)   效率次之,需要拼接SQL語句
          分頁方案三:(利用SQL的游標存儲過程分頁)    效率最差,但是最為通用

          本文轉摘自『IT學習者』http://www.itlearner.com/article/2007/3740.shtml




          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          Feedback

          # re: 三種SQL分頁法  回復  更多評論   

          2009-11-10 14:17 by 劉策
          還是Mysql簡單

          # re: 三種SQL分頁法  回復  更多評論   

          2009-11-12 14:08 by IXR
          有row_number函數可以用吧!
          這個效率在海量數據分頁時是最快的吧!
          主站蜘蛛池模板: 古交市| 东城区| 宜宾市| 克东县| 广宁县| 什邡市| 牡丹江市| 屏东市| 长泰县| 同心县| 晋江市| 樟树市| 句容市| 怀远县| 茂名市| 大渡口区| 龙陵县| 威信县| 平舆县| 德兴市| 巨鹿县| 米林县| 荆门市| 松原市| 怀安县| 类乌齐县| 安福县| 长顺县| 缙云县| 贵南县| 平果县| 馆陶县| 随州市| 阜平县| 横峰县| 孝昌县| 西充县| 浪卡子县| 青海省| 舒城县| 邓州市|