文档章节

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

夏至如沫
 夏至如沫
发布于 2013/11/18 12:03
字数 1067
阅读 1681
收藏 6

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


现象描述: 环境是 .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优化之存储过程强制编译

© 著作权归作者所有

共有 人打赏支持
夏至如沫
粉丝 11
博文 38
码字总数 23667
作品 0
郑州
后端工程师
大家帮我分析下Mysql的存储过程的一个问题,返回结果非常缓慢?

下面的是一个存储过程,调用函数。执行下面的存储过程,返回结果非常缓慢,会出现“内存溢出”的 错误提示?主意:这里的内存溢出,不是Java代码里,而是数据库工具内存溢出(很有可能数据库...

CapJes
2016/04/30
273
2
一次数据库问题优化

最近连续几天,mysql数据库会运行中假死,记录一下排查过程。 1、在数据库相应缓慢的时候,用client连接上去,执行show processlist 命令, 查看是哪条语句执行缓慢,或者哪些语句执行缓慢。...

applepaihs
01/19
0
0
HDFS文件目录list操作加速优化

前言 在我们使用HDFS作为数据存储文件系统时,恐怕最常使用到的命令就是ls命令了。我们往往先使用这个命令查找出目前我们期待的文件目录信息,然后对查出的这些文件目录做后续的操作。所以说...

androidlushangderen
05/25
0
0
关于pg插入缓慢问题,求大神指导

@kenyon君羊 你好,想跟你请教个问题:你好,我请问下PostgreSQL执行存储过程的时候插入fei非常缓慢,但是我不知道从哪里开始排查,请大神指教下

黄羽蒙
2016/11/24
90
4
MySQL DDL操作--------存储过程最佳实战

1. 背景 * 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定...

asd1123509133
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

新工作与老项目

新的工作不知不觉的干了一个多月了。怎么说呢,跟想象中的差别不少,本来想的能进来跟大公司的同事能有很多交流,能在团队中跟大牛学习更快。结果公司的这个项目上只有两个程序员,项目是十年...

zypy333
16分钟前
0
0
mysql 在windows的安装

mysql 在windows的安装。 mysql64位的server的下载地址是: https://dev.mysql.com/downloads/mysql/ 使用的是5.7版本。 下载安装包,解压至D:\mysql\mysql-5.7.23-winx64\ 在D:\mysql\mysq...

lxzh504
28分钟前
1
0
云技术、大数据(hadoop)入门常见问题回答

当我们学习一门新技术的时候,我们总是产生各种各样的问题,这些问题整理出来,包括该 1.如何学习hadoop? 2.hadoop常见问题? 3.还有hbase、hive安装使用等? 你知道搭建hadoop平台需要些什...

董黎明
28分钟前
1
0
小程序自定义底部tab

场景 1.tabBar是在内页而非首页,这时就不得不自定义一个tabBar了 2.自定义风格 3.子页数量超过5个,得到更多了tab 4.改变点击tab默认事件,比如出登录界面,或者弹出上拉子菜单等 步骤 1.照...

萤火的萤火
34分钟前
1
0
shell炫技

1.为脚本添加“--help” #!/bin/shif [ ${#@} -ne 0 ] && [ "${@#"--help"}" = "" ]; then printf -- '...help...\n'; exit 0;fi; 2.输出字体添加颜色 https://misc.flogisoft.com......

HJCui
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部