在页面执行很慢, 而在查询分析器中很快,该怎么处理
在页面执行很慢, 而在查询分析器中很快
今天有个很奇怪的事情——页面加载用户数据很慢, 而相关的存储过程在查询分析器中却很快。
后来把存储过程修改了一下(没有实质改动, 只是加个空格而已)页面查询就快了。
看了一下这个贴子: http://bbs.****.net/topics/370121598
但这个似乎又不科学。
如果说表里的数据发生了变化, 而统计信息没有来得及更新, 导致了执行计划按原来的。
那为什么只有页面上的执行慢, 而查询分析器上的快?为什么不是两者都慢呢?
请各位大大不吝赐教!
------解决思路----------------------
是同一个存储过程 ,传入参数 也完全一样吗
------解决思路----------------------
多是执行计划问题。楼主传递的参数值在具体的表中关联是否有大量数据?这可能导致执行计划还是按照以前的来执行,并不是最好的。只有重新按照 这个参数具体值执行的存储过程,执行计划对当前这个查询才是最优的。
今天有个很奇怪的事情——页面加载用户数据很慢, 而相关的存储过程在查询分析器中却很快。
后来把存储过程修改了一下(没有实质改动, 只是加个空格而已)页面查询就快了。
看了一下这个贴子: http://bbs.****.net/topics/370121598
但这个似乎又不科学。
如果说表里的数据发生了变化, 而统计信息没有来得及更新, 导致了执行计划按原来的。
那为什么只有页面上的执行慢, 而查询分析器上的快?为什么不是两者都慢呢?
请各位大大不吝赐教!
------解决思路----------------------
是同一个存储过程 ,传入参数 也完全一样吗
------解决思路----------------------
多是执行计划问题。楼主传递的参数值在具体的表中关联是否有大量数据?这可能导致执行计划还是按照以前的来执行,并不是最好的。只有重新按照 这个参数具体值执行的存储过程,执行计划对当前这个查询才是最优的。
--这种存储过程生成的执行计划,是按照第一次执行时,传递的参数具体值生成的,往后无聊传递的值在表中多少,执行计划都是一样
CREATE PROCEDURE P_Test(@ID INT)
AS
BEGIN
select col1,caol2 from tab where ID = @ID
END
--以上这种可以这样重新编译
EXEC P_Test @ProductID = 11 WITH RECOMPILE
--这种写法无论传递的值是什么,生成的执行计划都是一样,不变的,使用了参数嗅探( @myid 未知参数),这种重新编译无效,执行计划还是一样
CREATE PROCEDURE P_Test(@ID INT)
AS
BEGIN
DECLARE @myid INT
SET @myid = @ID --区别在这里
select col1,caol2 from tab where ID = @myid
END