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

hm1989wz 2013-12-03 08:58:45
因公司业务需要,需要每天凌晨从别的系统(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
...全文
409 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-12-30
  • 打赏
  • 举报
回复
引用 8 楼 hm1989wz 的回复:
各位大神们,这几天观察发现,单独使用sql2005里面用OPENQUERY连接Oracle也会很慢,300条数据大概需要7秒的样子,这个需要如何优化?
这个说明从oracle端获取数据很慢,你试过直接在oracle上运行OPENQUERY中的select 语句,快吗
hm1989wz 2013-12-30
  • 打赏
  • 举报
回复
各位大神们,这几天观察发现,单独使用sql2005里面用OPENQUERY连接Oracle也会很慢,300条数据大概需要7秒的样子,这个需要如何优化?
LongRui888 2013-12-03
  • 打赏
  • 举报
回复
引用 3 楼 hm1989wz 的回复:
[quote=引用 2 楼 u012173239 的回复:] 这个样子写很容易死锁。
那有什么好的建议,谢谢。[/quote] 上面的代码修改了后,试了,还是不能快是吗? 你可以考虑在表hisdb2.dbo.his_charge_acc_o 上的字段charge_date 上建个索引看看。
hm1989wz 2013-12-03
  • 打赏
  • 举报
回复
引用 2 楼 u012173239 的回复:
这个样子写很容易死锁。
那有什么好的建议,谢谢。
Landa_Jimmy 2013-12-03
  • 打赏
  • 举报
回复
这个样子写很容易死锁。
LongRui888 2013-12-03
  • 打赏
  • 举报
回复
你把存储过程改成这样试试,加上事务:



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
    
    begin tran
	   delete hisdb2.dbo.his_charge_acc_o where charge_date>=@ST_DATE and charge_date<@ED_DATE
	commit tran
	
	begin tran
		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
    commit tran
end
發糞塗牆 2013-12-03
  • 打赏
  • 举报
回复
1、6楼说的有道理 2、可能因为oracle端的一些信息发生了改变,sp需要重编译,生成一下低效的执行计划导致
专注or全面 2013-12-03
  • 打赏
  • 举报
回复
因为你说“单独执行却挺快”,那你不太可能凌晨去单独执行,应该是在白天手动执行测试的 唯独到了晚上慢,估计是受别的因素影响
专注or全面 2013-12-03
  • 打赏
  • 举报
回复
需要每天凌晨从别的系统(Oracle数据库) 你白天手动跑一下这个存储过程看看是不是一样慢? 我是怀疑是不是你存储过程执行的时候,别的数据库或者是sqlserver本身有维护的动作,比如重建索引了,备份了之类的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧