最近遇到一个问题,两个页面查询非常慢,需要30~40秒,而相同的代码通过Microsoft SQL Server Management Studio或者VS的SQL查询工具查询却能秒出数据,感到非常奇怪。
如果修改存储过程,短时段内恢复正常,过一段时间又重新出现问题,大概是存储过程计划缓存的问题,可以试下重新编译存储过程:
exec sp_recompile @objname='存储过程名称'
ASP.NET调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题,过段时间又会出来同样的问题。
如果判定是缓存的问题解决办法可以参考下面的方法:
方法一:在可能比较耗时的语句后面加上option(recompile)
方法二:强制编译存储过程
SQL Server 提供三种重新编译存储过程的方法:
(1)、sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。
示例:exec sp_recompile 存储过程名
(2)、创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。
示例:Create Proc 存储过程名 WITH RECOMPILE AS 参数
(3)、在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。
示例:存储过程名 WITH RECOMPILE
如果无法判定是缓存引起的可以试试下面的这样办法:
把执行Procedure 的参数直接拼好传递给查询语句执行代替从代码中直接调用存储过程。
创建 CommandType = CommandType.Text
的 DbCommand 对象,再调用
ExecuteDataSet("EXEC PRO_SFDAB008_QUERY '',null,'2009-01-01','2014-01-01' ");
把执行Procedure 的参数直接拼好传递。
实际问题的最终解决办法是将原来的一个查询分拆开,使用了临时表,问题解决。