• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發C#.NET → 通用存儲過程分頁(使用ROW_NUMBER()和不使用ROW_NUMBER()兩種情況)性能分析

    通用存儲過程分頁(使用ROW_NUMBER()和不使用ROW_NUMBER()兩種情況)性能分析

    相關軟件相關文章發表評論 來源:jiangrod時間:2010/3/17 12:03:32字體大?。?em class="fontsize">A-A+

    作者:不詳點擊:805次評論:0次標簽: 存儲過程

    SQL Procedure Writer1.0.0 綠色版
    • 類型:數據庫類大?。?i>331KB語言:英文 評分:6.6
    • 標簽:
    立即下載

    -- =============================================
    -- Author: <jiangrod>
    -- Create date: <2010-03-03>
    -- Description: <SQL2000通用分頁存儲過程>調用方法: sp_Pager2000 'xtest','*','ID','ORDER BY ID ASC','xname like ''%222name%''',3,20,0,0
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_Pager2000]
    @tblName varchar(255), -- 表名如:'xtest'
    @strGetFields varchar(1000) = '*', -- 需要返回的列如:'xname,xdemo'
    @pkName nvarchar(50)='ID', -- 主鍵名
    @strOrder varchar(255)='', -- 排序的字段名如:'order by id desc'
    @strWhere varchar(1500) = '', -- 查詢條件(注意:不要加where)如:'xname like ''%222name%'''
    @pageIndex int = 1, -- 頁碼如:2
    @pageSize int = 20, -- 每頁記錄數如:20
    @recordCount int=0 out, -- 記錄總數
    @doCount bit=0 -- 非0則統計,為0則不統計(統計會影響效率)
    AS

    Declare @sql nvarchar(4000)
    Declare @sqltemp nvarchar(1000)
    set @sql=' From '+@tblName
    if(@strWhere!='') set @sql=@sql+' Where '+@strWhere

    declare @strCount nvarchar(1000)
    --總記錄條數
    if(@doCount!=0)
    begin
    if(@strWhere !='')
    begin
    set @strCount='set @num=(select count(1) from '+ @tblName + ' where '+@strWhere+' )'
    end
    else
    begin
    set @strCount='set @num=(select count(1) from '+ @tblName + ' )'
    end
    EXECUTE sp_executesql @strCount ,N'@num INT output',@RecordCount output
    end

    if @strWhere !=''
    begin
    set @strWhere=' where '+@strWhere
    end

    if (@PageIndex>1)
    begin
    set @sqltemp=@PKName+' not in (Select Top '+cast((@PageSize*(@PageIndex-1)) as nvarchar)+' '+@PKName+' '+@sql
    if(@strOrder!='')set @sqltemp=@sqltemp+' '+@strOrder
    set @sqltemp=@sqltemp+')'
    set @sql='Select Top '+cast(@PageSize as nvarchar)+' '+@strGetFields+' '+@sql
    if(@strWhere!='')set @sql=@sql+' And '+@sqltemp
    else set @sql=@sql+' Where '+@sqltemp
    end
    else
    begin
    set @sql='Select Top '+cast(@PageSize as nvarchar)+' '+@strGetFields+' '+@sql
    end
    if(@strOrder!='') set @sql=@sql+' '+@strOrder
    exec(@sql)

     

    -- =============================================
    -- Author: <jiangrod>
    -- Create date: <2010-03-03>
    -- Description: <SQL2005及后續版本通用分頁存儲過程>調用方法: sp_Pager2005 'xtest','*','ORDER BY ID ASC','xname like ''%222name%''',2,20,0,0
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_Pager2005]
    @tblName varchar(255), -- 表名如:'xtest'
    @strGetFields varchar(1000) = '*', -- 需要返回的列如:'xname,xdemo'
    @strOrder varchar(255)='', -- 排序的字段名如:'order by id desc'
    @strWhere varchar(1500) = '', -- 查詢條件(注意:不要加where)如:'xname like ''%222name%'''
    @pageIndex int = 1, -- 頁碼如:2
    @pageSize int = 20, -- 每頁記錄數如:20
    @recordCount int output, -- 記錄總數
    @doCount bit=0 -- 非0則統計,為0則不統計(統計會影響效率)
    AS

    declare @strSQL varchar(5000)
    declare @strCount nvarchar(1000)
    --總記錄條數
    if(@doCount!=0)
    begin
    if(@strWhere !='')
    begin
    set @strCount='set @num=(select count(1) from '+ @tblName + ' where '+@strWhere+' )'
    end
    else
    begin
    set @strCount='set @num=(select count(1) from '+ @tblName + ' )'
    end
    EXECUTE sp_executesql @strCount ,N'@num INT output',@RecordCount output
    end

    if @strWhere !=''
    begin
    set @strWhere=' where '+@strWhere
    end
    set @strSQL='SELECT * FROM (SELECT ROW_NUMBER() OVER ('+@strOrder+') AS ROWID,'
    set @strSQL=@strSQL+@strGetFields+' FROM ['+@tblName+'] '+@strWhere
    set @strSQL=@strSQL+') AS sp WHERE ROWID BETWEEN '+str((@PageIndex-1)*@PageSize+1)
    set @strSQL=@strSQL+' AND '+str(@PageIndex*@PageSize)
    exec (@strSQL)

     

     

     

     


    對上面兩個存儲過程進行了測試,測試環境:酷睿2雙核2.20Gh,1G內存,SQL SERVER2008

    對50萬條數據進行了分頁查詢測試

    查詢的條件是:xname like '%222name%'

    "page1:2秒937毫秒":表示打開第一頁使用的時間,其他依次類推

    不使用ROW_NUMBER()每頁都要統計:
    page1:2秒937毫秒
    page2:3秒140毫秒
    page3:3秒453毫秒
    page4:3秒609毫秒
    page5:3秒843毫秒
    page6:4秒156毫秒

    不使用ROW_NUMBER()僅第一頁統計:
    page1:2秒937毫秒
    page2:0秒343毫秒
    page3:0秒593毫秒
    page4:0秒812毫秒
    page5:1秒46毫秒
    page6:1秒281毫秒

    使用ROW_NUMBER()每頁都要統計:
    page1:2秒937毫秒
    page2:3秒31毫秒
    page3:3秒156毫秒
    page4:3秒296毫秒
    page5:3秒421毫秒
    page6:3秒515毫秒

    使用ROW_NUMBER()僅第一頁統計:
    page1:2秒937毫秒
    page2:0秒218毫秒
    page3:0秒359毫秒
    page4:0秒468毫秒
    page5:0秒578毫秒
    page6:0秒687毫秒

    結論:在存儲過程當中如果每次都統計記錄總數將會嚴重影響效率,相同的查詢條件記錄總數必定是相同的,所以如果第一頁執行之后把記錄總數保存起來,點擊其他頁次的時候命令存儲過

    程不再統計記錄總數將會大大提高系統性能。通過測試結果看出每次都要統計總記錄數使用ROW_NUMBER()和不使用ROW_NUMBER()差別不是太大,如果僅第一次統計總記錄數使用ROW_NUMBER()將

    會比不使用ROW_NUMBER()的效率提高很多。

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>