文档章节

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

夏至如沫
 夏至如沫
发布于 2013/11/18 12:03
字数 1067
阅读 1723
收藏 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
288
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
107
4
MySQL DDL操作--------存储过程最佳实战

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

asd1123509133
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SRE的含义及与 DevOps 如何关联?

虽然站点可靠性工程师(site reliability engineer SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题...

linuxCool
1分钟前
0
0
月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
22分钟前
1
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
48分钟前
172
7
Confluence 6 修改导航显示选项

选择 子页面(Child pages)来在边栏中查看当前页面的子页面。 选择 页面树(Page tree)来查看整个空间的页面树,扩展当前的页面。 你也可以选择是否完全隐藏导航显示选项或者添加你希望可见...

honeymose
今天
2
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部