亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

sqlserver2005利用臨時表和@@RowCount提高分頁查詢存儲過程性能示例分享

2024-08-31 01:01:55
字體:
來源:轉載
供稿:網友

最近發現現有框架的通用查詢存儲過程的性能慢,于是仔細研究了下代碼:

復制代碼 代碼如下:


Alter PROCEDURE [dbo].[AreaSelect]
    @PageSize int=0,
    @CurrentPage int=1,
    @Identifier int=NULL,
    @ParentId int=NULL,
    @AreaLevel int=NULL,
    @Children int=NULL,
    @AreaName nvarchar(50)=NULL,
    @Path nvarchar(MAX)=NULL,
    @Status int=NULL,
    @Alt int=NULL
AS
BEGIN
    SET NOCOUNT ON;
    IF (NOT @AreaName IS NULL)    SET @AreaName='%'+@AreaName+'%'
    IF (NOT @Path IS NULL)    SET @Path='%'+@Path+'%'
    IF (@PageSize>0)
    BEGIN
        DECLARE @TotalPage int
        Select @TotalPage=Count(Identifier) FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
        IF(@TotalPage%@PageSize=0)
        BEGIN
            SET @TotalPage=@TotalPage/@PageSize
        END
        ELSE
        BEGIN
            SET @TotalPage=Round(@TotalPage/@PageSize,0)+1
        END
        Select TOP (@PageSize) Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt,@TotalPage as totalPage FROM Area Where
        Identifier NOT IN (Select Top (@PageSize*(@CurrentPage-1))Identifier FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
            order by AreaName asc)
        AND
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
            order by AreaName asc
    END
    ELSE
    BEGIN
        Select Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
            order by AreaName asc
    END
END

發現每次查詢都需要按條件查詢依次Area表,性能太低,于是利用臨時表將符合條件的記錄取出來,然后針對臨時表進行查詢,代碼修改如下:
Alter PROCEDURE [dbo].[AreaSelect]
    @PageSize int=0,
    @CurrentPage int=1,
    @Identifier int=NULL,
    @ParentId int=NULL,
    @AreaLevel int=NULL,
    @Children int=NULL,
    @AreaName nvarchar(50)=NULL,
    @Path nvarchar(MAX)=NULL,
    @Status int=NULL,
    @Alt int=NULL
AS
BEGIN
    SET NOCOUNT ON;
    IF (NOT @AreaName IS NULL)    SET @AreaName='%'+@AreaName+'%'
    IF (NOT @Path IS NULL)    SET @Path='%'+@Path+'%'

   
    IF (@PageSize>0)
    BEGIN
        --創建臨時表
        Select
        Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt
        INTO #temp_Area
        FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
        order by AreaName asc

        DECLARE @TotalPage int
        DECLARE @SumCount int

        --取總數
        Select @SumCount=Count(Identifier) FROM #temp_Area

        IF(@SumCount%@PageSize=0)
        BEGIN
            SET @TotalPage=@SumCount/@PageSize
        END
        ELSE
        BEGIN
            SET @TotalPage=Round(@SumCount/@PageSize,0)+1
        END
        Select TOP (@PageSize) Identifier,ParentId,AreaLevel,Children,AreaName,
        Path,Status,Alt,@TotalPage as totalPage,@SumCount as SumCount
        FROM #temp_Area
        Where
        Identifier NOT IN (Select Top (@PageSize*(@CurrentPage-1))Identifier FROM #temp_Area))
    END
    ELSE
    BEGIN
        Select Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
            order by AreaName asc
    END
END

經過使用臨時表的確提高性能,不過有發現一個問題,就是count(Identifier)的確很耗性能,于是又進行修改了

Alter PROCEDURE [dbo].[AreaSelect]
    @PageSize int=0,
    @CurrentPage int=1,
    @Identifier int=NULL,
    @ParentId int=NULL,
    @AreaLevel int=NULL,
    @Children int=NULL,
    @AreaName nvarchar(50)=NULL,
    @Path nvarchar(MAX)=NULL,
    @Status int=NULL,
    @Alt int=NULL
AS
BEGIN
    SET NOCOUNT ON;
    IF (NOT @AreaName IS NULL)    SET @AreaName='%'+@AreaName+'%'
    IF (NOT @Path IS NULL)    SET @Path='%'+@Path+'%'

   
    IF (@PageSize>0)
    BEGIN
        --創建中記錄數
        DECLARE @SumCount int

        --創建臨時表
        Select
        Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt
        INTO #temp_Area
        FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
        order by AreaName asc
        --設置總記錄數為剛操作的記錄數
        SET @SumCount=@@RowCount

        DECLARE @TotalPage int

        IF(@SumCount%@PageSize=0)
        BEGIN
            SET @TotalPage=@SumCount/@PageSize
        END
        ELSE
        BEGIN
            SET @TotalPage=Round(@SumCount/@PageSize,0)+1
        END
        Select TOP (@PageSize) Identifier,ParentId,AreaLevel,Children,AreaName,
        Path,Status,Alt,@TotalPage as totalPage,@SumCount as SumCount
        FROM #temp_Area
        Where
        Identifier NOT IN (Select Top (@PageSize*(@CurrentPage-1))Identifier FROM #temp_Area))
    END
    ELSE
    BEGIN

        Select Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt FROM Area Where
        (@Identifier IS NULL or Identifier=@Identifier)AND
        (@ParentId IS NULL or ParentId=@ParentId)AND
        (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND
        (@Children IS NULL or Children=@Children)AND
        (@AreaName IS NULL or AreaName Like @AreaName)AND
        (@Path IS NULL or Path Like @Path)AND
        (@Status IS NULL or Status=@Status)AND
        (@Alt IS NULL or Alt=@Alt)
        order by AreaName asc
    END
END

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丰满岳妇乱一区二区三区| 亚洲午夜色婷婷在线| 日韩欧美国产中文字幕| 91在线视频导航| 亚洲欧美日韩一区在线| 欧美激情免费看| 久久精品男人天堂| 国产精品嫩草影院久久久| 日韩视频免费在线观看| 97色在线视频观看| 欧美午夜美女看片| 欧美性生活大片免费观看网址| 国内精久久久久久久久久人| 欧美一级电影久久| 岛国av午夜精品| 亚洲美女喷白浆| 国产日韩精品在线观看| 亚洲欧美精品一区二区| 久久99国产精品久久久久久久久| 亚洲最大福利视频网站| 国产精品a久久久久久| 日韩小视频网址| 国产精品看片资源| 日本免费久久高清视频| 午夜精品一区二区三区视频免费看| 国产日韩一区在线| 91欧美精品成人综合在线观看| 久久国内精品一国内精品| 大桥未久av一区二区三区| 亚洲欧美激情视频| 91高清视频免费| 啊v视频在线一区二区三区| 97精品国产97久久久久久春色| 奇门遁甲1982国语版免费观看高清| 精品小视频在线| 国产精品毛片a∨一区二区三区|国| 亚洲综合日韩中文字幕v在线| 国产精品久久久一区| 91欧美日韩一区| 亚洲人成在线播放| www.国产一区| 久久影视电视剧免费网站清宫辞电视| 97免费中文视频在线观看| 大荫蒂欧美视频另类xxxx| 欧美激情免费在线| 欧美xxxx做受欧美.88| 97超碰蝌蚪网人人做人人爽| 国产精品黄色av| 91精品一区二区| 国产精品一区二区三区成人| 精品久久久久久| 国产精品欧美久久久| 亚洲人成电影网站色…| 97香蕉久久夜色精品国产| 成人午夜小视频| 日韩在线欧美在线| 日本成人在线视频网址| 成人www视频在线观看| 欧美三级欧美成人高清www| 欧美一二三视频| 国产一区二区三区18| 国产成人一区二区三区| 亚洲成人网久久久| 奇米四色中文综合久久| 日本精品一区二区三区在线播放视频| 国产又爽又黄的激情精品视频| 欧洲亚洲女同hd| 日韩av色综合| 国产精品h在线观看| 亚洲情综合五月天| 欧美在线视频免费观看| 俺去了亚洲欧美日韩| 红桃av永久久久| 国产美女搞久久| 大量国产精品视频| 欧美激情在线狂野欧美精品| 亚洲精品国产欧美| 国产精品91久久久| 国产欧美最新羞羞视频在线观看| 伊人伊成久久人综合网站| 欧美大尺度电影在线观看| 日本亚洲欧美三级| 亚洲r级在线观看| 黄色一区二区在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲大胆美女视频| 国产视频久久久久久久| 国产婷婷成人久久av免费高清| 国产在线播放91| 亚洲有声小说3d| 国产精品稀缺呦系列在线| 国产97色在线|日韩| 免费97视频在线精品国自产拍| 性日韩欧美在线视频| 91系列在线播放| 欧美日韩加勒比精品一区| 国产精品久久久久av免费| 亚洲va国产va天堂va久久| 亚洲综合日韩中文字幕v在线| 日本精品久久久久久久| 国产精品白丝jk喷水视频一区| 97视频在线看| 欧美极品少妇xxxxⅹ裸体艺术| 亚州国产精品久久久| 亚洲欧洲国产伦综合| 国产亚洲精品激情久久| 欧美大肥婆大肥bbbbb| 日韩欧美在线免费| 国产欧美一区二区三区久久| 亚洲欧美日韩久久久久久| 韩国福利视频一区| 日本a级片电影一区二区| 国产精品久久久久999| 亚洲毛片在线观看.| 亚洲一区二区三区成人在线视频精品| 国产精品久久久久影院日本| 亚洲大尺度美女在线| 日韩欧美国产免费播放| 人九九综合九九宗合| 狠狠做深爱婷婷久久综合一区| 欧美日韩另类在线| 高清亚洲成在人网站天堂| 在线看国产精品| 国产激情久久久久| 日韩国产高清视频在线| 日韩一区二区精品视频| 精品亚洲国产视频| 成人精品视频在线| 国产成人精品在线播放| 亚洲精品98久久久久久中文字幕| 欧美午夜性色大片在线观看| 日本精品性网站在线观看| 成人免费网站在线观看| 欧美丝袜一区二区三区| 色哟哟网站入口亚洲精品| 精品国产乱码久久久久久虫虫漫画| 亚洲电影免费观看高清完整版在线| 欧美日本啪啪无遮挡网站| 国产美女久久久| 国产69精品久久久久9999| 色播久久人人爽人人爽人人片视av| 国产一区二区三区在线看| 在线观看亚洲视频| 中文字幕国产精品久久| 最近2019中文字幕大全第二页| 亚洲欧美日本精品| 伊人伊人伊人久久| 亚洲欧美成人网| 亚洲自拍欧美另类| 青青在线视频一区二区三区| 97精品视频在线| 久久久久久久久爱| 成人国产亚洲精品a区天堂华泰| 91精品久久久久| 精品人伦一区二区三区蜜桃免费| 91免费观看网站| 国产精品久久久久久久久久东京| 国产成人一区二区三区| 久久黄色av网站| 欧美电影在线观看| 亚洲片国产一区一级在线观看| 日韩免费在线免费观看| 日本成人黄色片| 精品视频—区二区三区免费|