单独执行很快-SQL存储过程比SQL语句慢,甚至卡死

问题描述

SQL存储过程比SQL语句慢,甚至卡死

因公司业务需要,需要每天凌晨从别的系统(Oracle数据库)取前一天的数据,建了存储过程后,发现执行存储过程经常卡死,单独执行却挺快,不知道是哪里出了问题,求大神帮忙分析下,万分感谢!以下为存储过程代码:

USE [HERP_BHYY]
GO
/****** 对象: StoredProcedure [dbo].[sp_GetHISChargeOReceiptDataInHISDBbyDay] 脚本日期: 12/03/2013 08:36:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_GetHISChargeOReceiptDataInHISDBbyDay] @ImpDate as DATETIME
AS
BEGIN
--SET NOCOUNT ON;
DECLARE @ST_DATE AS DATETIME
DECLARE @ED_DATE AS DATETIME
DECLARE @TEMP_DATE DATETIME

IF @ImpDate is not null
begin
    SET @ST_DATE=LEFT(@ImpDate,10)
    SET @ED_DATE=dateadd(day,1,@ST_DATE)
end

delete hisdb2.dbo.his_charge_acc_o where charge_date>=@ST_DATE and charge_date<@ED_DATE
insert into hisdb2.dbo.his_charge_acc_o
      (charge_date, deposit_pre, pay_type_code, patient_type_code, his_irecord, charge_money, patient_code, invoice_no, operator, acc_flag, balance_flag, invoice_type)
select charge_date, deposit_pre, pay_type_code, patient_type_code, his_irecord, charge_money, patient_code, invoice_no, operator, acc_flag, balance_flag, invoice_type
from openquery(HIS,'select charge_date, deposit_pre, pay_type_code, patient_type_code, his_irecord, charge_money, patient_code, invoice_no, operator, acc_flag, balance_flag, invoice_type  from data_hrp.HIS_CHARGE_ACC_o')
where charge_date>=@ST_DATE and charge_date<@ED_DATE

end

时间: 2016-01-28

单独执行很快-SQL存储过程比SQL语句慢,甚至卡死的相关文章

PL/SQL --&amp;gt; 动态SQL的常见错误

--============================ -- PL/SQL --> 动态SQL的常见错误 --============================       动态SQL在使用时,有很多需要注意的地方,如动态SQL语句结尾处不能使用分号(;),而动态PL/SQL结尾处需要使用分号(;),但不能使用正 斜杠结尾(/),以及shcema对象不能直接作为变量绑定.本文介绍了动态SQL的常见问题.   一.演示动态SQL的使用     下面的示例中,首先使用动态SQL基于sco

PL/SQL --&amp;gt; 动态SQL

--==================== -- PL/SQL --> 动态SQL --====================         使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行 SQL查询语句,对于这种情况需要使用动态SQL来完成.再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只 能针对某几个特定的表来形成分页.而使用动态的SQL,则可以对不同的表,不同的字段进行

PL/SQL --&amp;gt; PL/SQL记录

--======================= -- PL/SQL --> PL/SQL记录 --=======================       PL/SQL记录有着类似于表的数据结构,是一个或多个字段且拥有数据类型的集合体.定义了PL/SQL记录类型之后,可以定义PL/SQL记录变 量.声明一个PL/SQL记录变量相当于定义了多个标量变量,简化了变量的声明,从而大大节省了内存资源.多用于简化单行多列的数据处理.     一.定义PL/SQL记录     1.直接定义PL/SQL

xml-存储过程执行SQL与Print SQL语句单独执行结果不同

问题描述 存储过程执行SQL与Print SQL语句单独执行结果不同 代码如下: DECLARE @SQLEX1 nVARCHAR(MAX) DECLARE @TempEX1 VARCHAR(MAX) SELECT @SQLEX1 = '' SELECT @TempEX1 = '' SET @SQLEX1 = 'SELECT @Temp3 = A.T FROM (SELECT T = REPLACE((SELECT DISTINCT ''20'' AS ''machine/@id1'',1 AS

存储过程与SQL语句的一个故事

存储过程|语句     我的一位朋友说:他从台湾知名技术作家李维先生的一本书中获悉,如果用存储过程封装SQL语句,系统效率将有极大提升.    他做过实验!!! --我相信朋友做过实验,尽管非亲眼所见.不过我估计他的实验有问题,那样的实验不但蒙蔽了他,也蒙蔽了李维先生(如果他的著作中的内容没有被误会),甚至更多的人.    然而我必须拿出证据,方能使人信服.    后来遇到一个具体的问题:客户端经常要向数据库插入记录.在J2EE中,一个 Entity Bean Home 的 create 方法调

存储过程与SQL语句如何选择

58到家数据库30条军规,有一条是"禁止使用存储过程.视图.触发器.Event", 高并发大数据的互联网业务,架构设计思路是"解放数据库CPU,将计算转移到服务层", 并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现"增机器就加性能". 数据库擅长存储与索引,在目前的互联网系统架构中,服务器的扩展要比存储的扩展更简单, 需要考虑系统可能的瓶颈在服务器还是数据存储,存储过程有它的优点,应该在开发中合理的

sql 存储过程执行过程中的奇怪问题

问题描述 sql 存储过程执行过程中的奇怪问题 某个存储过程,大概如下 b=0,c=0,d=0 如果 a=1 执行下面的 b=b+2;c=c+3;d=d+4 否则 b=b-2;c=c-3;d=d-4 当第一次赋值a=1的时候,存储过程只执行了 b=b+2;d=d+4:而c=c+3;这个语句无执行,所以这个时候c还是0 接着执行a!=0的时候,存储过程执行 b=b-2;c=c-3;d=d-4.所以这个时候c=-3 再执行a=1,存储过程执行 b=b+2;c=c+3;d=d+4.所以这个时候c=0

mysql sql存储过程流程控制if语句用法

今天我们要来讲一下关于mysql教程 sql存储过程流程控制if语句用法与实例教程吧 if语句 if实现条件判断,满足不同条件执行不同的操作,这个我们只要学编程的都知道if的作用了,下面我们来看看mysql 存储过程中的if是如何使用的吧. if contion then list      [elseif condition then list].........      [else list] end if 这样看上去像asp教程里面的条件,但在elseif时又有些像php教程中的if,但

select-表A两个字段分别a与b,字段a与b都是单独索引,请描述一下sql的语句的问题

问题描述 表A两个字段分别a与b,字段a与b都是单独索引,请描述一下sql的语句的问题 求职的时候遇到一个笔试题,我楞是不知道有什么问题.求问答 表A两个字段分别a与b,字段a与b都是单独索引,请描述一下sql的语句的问题? SELECT * FROM A where b=1 or a=1: 解决方案 这个SQL的索引用不上啦 解决方案二: 会导致索引失效,造成全表扫描. 解决方案三: 主流的数据库对于这种整数做索引都是基于btree当你用or包含2个独立索引的条件的时候,索引会失效,引起全表扫