.NET 存储过程调用执行缓慢

妈妈说我,从小记性就不好,什么东西都要记下来才行。


现象描述: 环境是 .NET 4.0,数据库是SQL2008,存储过程在数据库中执行很快,但是使用代码调用时异常的缓慢。数据库操作类代码是使用 Microsoft.Practices.EnterpriseLibrary.Data.Database.GetStoredProcCommand 创建 StoredProcedure 类型 Commond 对象,然后使用 ExecuteDataSet 方法执行的。


1). 发生某一个存储过程执行异常缓慢,而其它的'小伙伴'都很正常。

(排除数据库瞬间压力的可能)有时候发生这种无法解释的问题,大都是人品问题。一般处理方法就是Drop 掉存储过程或者 Recomplie (语法: exec sp_recompile @objname='存储过程的名字')一下。如果这个还不行,恭喜你可以玩一下' 删空格' 游戏了。有时候我们会发现查询语句中多了意外的全角空格会导致查询错误或者执行异常,所以不管什么空格,把多余的全删除下,重新执行也许就顺利通过了。当然这个不一定适用你的情况,没办法的时候只能死马全当活马医了。

2)如果普遍或者较多的存储过程都出现这种让人纠结的问题。

应该考虑是不是哪里疏忽了,因为我们在做测试的时候可能传入了和程序中不一样的限制条件导致的。一开始我也不相信自己会犯这样的错误,但是当我去检查代码的时候发现,原来自己推测的传入参数太‘天真’了(说实话我们项目组刚发生了这样的情况,搞的一星期都是在开会研究确认这个问题,然后向总部提交了疑难问题,结果在第二周的时候发现原来我们都天真了一把。)。所以还是要检查一下代码确认自己已经很纯洁了,再来考虑是不是代码框架发生了问题。

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 对象,再调用

<!-- lang: c# -->
ExecuteDataSet("EXEC PRO_SFDAB008_QUERY '',null,'2009-01-01','2014-01-01' ");

把执行Procedure 的参数直接拼好传递。


上面的方法不一定管用,但是在没有办法的时候试一试总是可以的。


百度参考: SQL优化之存储过程强制编译

转载于:https://my.oschina.net/HenuToater/blog/177175

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值