文档章节

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

夏至如沫
 夏至如沫
发布于 2013/11/18 12:03
字数 1067
阅读 1706
收藏 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
关于pg插入缓慢问题,求大神指导

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

黄羽蒙
2016/11/24
90
4
HDFS文件目录list操作加速优化

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

androidlushangderen
05/25
0
0
MySQL DDL操作--------存储过程最佳实战

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

asd1123509133
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VS code编辑器安装 php7.2 NTS 版本 Xdebug

本文使用的是 phpstudy 一键安装包(windows32位) php 版本是 php7.2 NTS 1、在 phpstudy 面板中开启 phpdebug 扩展 // 其他选项菜单-> php 扩展与设置-> php 扩展 2、官方下载 Xdebug // ...

削个椰子皮_给个梨
25分钟前
1
0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果您也碰到了同样的问题,希望本文对您有用。 问题...

程序猿DD
56分钟前
3
0
sql 命令

show variables like '%general%'; show variables like '%log_output%'; show variables like '%quer%'; show global status like '%slow%';...

JavaSon712
今天
4
0
Django修改默认数据库引擎

Django默认数据库引擎为sqlite3,除了sqlite3,还支持postgresql、mysql、oracle 配置如下:其中postgresql_psycopg2为postgresql的适配器。 'django.db.backends.postgresql' 'django.db.bac......

MichaelShu
今天
0
0
动画源码解析

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍 2.2 如何计算动画数据 2.3 什么是动画更新函数 2.4 动画数据如何存储 2.5 Animation的调用 3.Animator...

潇湘剑雨
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部