none
存储过程分页 RRS feed

  • 问题

  • 如下为两个分页的存储过程:

    ALTER PROCEDURE [dbo].[T_U_Menu_GetAllMenus]
        (
          @page INT ,
          @pagesize INT 
        )
    AS 
        SET NOCOUNT ON;
        BEGIN
            SELECT  COUNT(MID)
            FROM    dbo.T_U_Menu;	       
            WITH    a AS ( SELECT   MID ,
                                    FID ,
                                    MCode ,
                                    MUrl ,
                                    MType ,
                                    MState ,
                                    IsBlank ,
                                    DNumber ,
                                    ROW_NUMBER() OVER ( ORDER BY MID ) 'T'
                           FROM     dbo.T_U_Menu
                         )
                SELECT  MID ,
                        FID ,
                        MCode ,
                        MUrl ,
                        MType ,
                        MState ,
                        IsBlank ,
                        DNumber
                FROM    a
                WHERE   t >= ( @pagesize * ( @page - 1 ) + 1 )
                        AND t <= ( @pagesize * @page )
                  
        END

    其中表数据是5,000,000条,页面调用时,前几千页都很快,当我点击最后几页时,系统慢 ;我用sql profiler调用了一下;发现是这个存储过程的问题

    也就是说,数据很大时,排序靠后的分页,取数会慢;

    于是,我把存储过程改为如下:

    ALTER PROCEDURE [dbo].[T_U_Menu_GetAllMenus]
        (
          @page INT ,
          @pagesize INT 
        )
    AS 
        SET NOCOUNT ON;
        BEGIN
            SELECT  COUNT(MID)
            FROM    dbo.T_U_Menu;	
            SELECT TOP ( @pagesize )
                    MID ,
                    FID ,
                    MCode ,
                    MUrl ,
                    MType ,
                    MState ,
                    IsBlank ,
                    DNumber
            FROM    dbo.T_U_Menu
            WHERE   MID > ( SELECT  ISNULL(MAX(MID), 0)
                            FROM    ( SELECT TOP ( ( @page - 1 ) * @pagesize )
                                                MID
                                      FROM      dbo.T_U_Menu
                                      ORDER BY  MID
                                    ) AS k
                          )
            ORDER BY MID;
        END

    同样的发现,在数据量大时,也不是很快;

    各们高手们,有没有好的法办啊?


    大其心,可容天下之物; 虚其心,可受天下之善;


    • 已编辑 lfofiug 2013年3月27日 5:07
    2013年3月27日 5:05

答案

全部回复