文档章节

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

夏至如沫
 夏至如沫
发布于 2013/11/18 12:03
字数 1067
阅读 1661
收藏 6
点赞 0
评论 0

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


现象描述: 环境是 .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
博文 37
码字总数 23521
作品 0
郑州
后端工程师
大家帮我分析下Mysql的存储过程的一个问题,返回结果非常缓慢?

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

CapJes ⋅ 2016/04/30 ⋅ 2

一次数据库问题优化

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

applepaihs ⋅ 01/19 ⋅ 0

HDFS文件目录list操作加速优化

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

androidlushangderen ⋅ 05/25 ⋅ 0

关于pg插入缓慢问题,求大神指导

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

黄羽蒙 ⋅ 2016/11/24 ⋅ 4

Java对存储过程的调用方法

一、Java如何实现对存储过程的调用: A:不带输出参数的 create procedure getsum @n int =0<--此处为参数--> as declare @sum int<--定义变量--> declare @i int set @sum=0 set @i=0 whil......

Kerry_Han ⋅ 2014/10/27 ⋅ 0

MySQL DDL操作--------存储过程最佳实战

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

asd1123509133 ⋅ 2017/07/06 ⋅ 0

SQL 存储过程的使用对数据的操作(整理思绪补基础)

什么是存储过程? 存储过程是SQL语句和控制语句的 预编译集合 ,保存在数据库里,可由应用程序调用执行,而且容许用户声明变量,逻辑控制语句及其他强大的编程功能。而且允许用户声明变量、有...

SLoan_ ⋅ 2016/11/24 ⋅ 0

Java存储过程调用CallableStatement

什么是存储过程? 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时...

桃子红了呐 ⋅ 2017/11/26 ⋅ 0

PHP调用Oracle存储过程

存储过程是实际位于 Oracle 中的程序。大多数存储过程都是用 PL/SQL 编写的,在 Oracle 数据库 10g 第 2 版和更高版本中,您可以用 Java、.NET 或其他语言将它们编写为外部过程。 存储过程通...

workingTiams ⋅ 2012/11/30 ⋅ 0

8、MySLQ存储过程

简述 存储过程是SQL语句和控制流语句的语句串(语句集合)。它不仅可以带有输入 参数还可以带有输出参数,存储过程是能够通过介绍参数向调用者返回结果集,结果集的格式由调用者确定。返回状...

CARYFLASH ⋅ 2017/11/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 34分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部