我正在使用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
由于
答案 0 :(得分:0)
要做的第一件事就是查看您的执行计划,如果您不理解,请与DBA讨论。
显而易见的事情是,你的where
子句几乎包含在某种函数中的每个列引用。这使得它们成为表达式并使SQL优化器无法使用可能存在的任何覆盖索引。
看起来你正在将一个表值函数称为不相关的子查询。这会让我担心性能问题。我可能会将其移出查询。而是只运行一次并填充临时表。