SQL分页超过10个lac记录

时间:2014-05-15 23:10:35

标签: asp.net sql optimization paging

我正在使用MS SQL 2008 R2。我的一张桌子有超过10个 lac 行 - 1 lac 是10 5 或100,000,所以10 lac 是1,000,000)。

我想将其绑定到ASP Gridview。我尝试了页面大小和索引的自定义分页。但网格没有绑定。发生超时错误。

尝试直接执行存储过程,但需要很长时间。

如何优化此程序?

我的程序

ALTER PROCEDURE SP_LOAN_APPROVAL_GET_LIST

  @USERCODE NVARCHAR(50) ,
  @FROMDATE DATETIME     = NULL ,
  @TODATE   DATETIME     = NULL ,
  @PAGESIZE INT          ,
  @PAGENO   INT          ,
  @TOTALROW BIGINT       OUTPUT

AS
BEGIN

  SELECT *
  FROM ( SELECT DOC_NO       ,
                DOC_DATE_GRE ,
                EMP_CODE     ,
                EMP_NAME_ENG as Name ,
                LOAN_AMOUNT  ,
                DESC_ENG     as Discription ,
                REMARKS      ,
                ROW_NUMBER() OVER(
                  ORDER BY ( SELECT 1 )
                  ) AS [ROWNO]
         from VW_PER_LOAN
         Where isnull( POST_FLAG   , 'N' )  = 'N'
           and ISNULl( CANCEL_FLAG , 'N' ) != 'Y'
           and DOC_DATE_GRE between ISNULL(@FROMDATE , DOC_DATE_GRE )
                                and ISNULL(@TODATE   , DOC_DATE_GRE )
           and  BRANCH in ( SELECT *
                            FROM DBO.FN_SSP_GetAllowedBranches(@USERCODE)
                          )
       ) T
  WHERE T.ROWNO BETWEEN ((@PAGENO-1)*@PAGESIZE)+1 AND @PAGESIZE*(@PAGENO)

  SELECT @TOTALROW=COUNT(*)
  from VW_PER_LOAN
  Where isnull(POST_FLAG,'N')= 'N'
    and ISNULl(CANCEL_FLAG,'N')!='Y'
    and DOC_DATE_GRE between ISNULL(@FROMDATE,DOC_DATE_GRE)and ISNULL(@TODATE,DOC_DATE_GRE)
    and BRANCH in ( SELECT *
                    FROM DBO.FN_SSP_GetAllowedBranches(@USERCODE)
                  )

END

由于

1 个答案:

答案 0 :(得分:0)

要做的第一件事就是查看您的执行计划,如果您不理解,请与DBA讨论。

显而易见的事情是,你的where子句几乎包含在某种函数中的每个列引用。这使得它们成为表达式并使SQL优化器无法使用可能存在的任何覆盖索引。

看起来你正在将一个表值函数称为不相关的子查询。这会让我担心性能问题。我可能会将其移出查询。而是只运行一次并填充临时表。