当前位置: 代码迷 >> Sql Server >> 执行时间平均在20分钟以上的储存求优化
  详细解决方案

执行时间平均在20分钟以上的储存求优化

热度:141   发布时间:2016-04-24 08:47:55.0
执行时间平均在20分钟以上的存储求优化
CREATE procedure [dbo].[pr_pyzx_get_advicedetail]
@dept_no varchar(10),@ldtt_from datetime,@ldtt_to datetime,@tq_person varchar(50),@tq_dept varchar(50)
as
declare @in_seq int
declare @use_dept varchar(50)
declare @rcd_date datetime
declare @long_id char(1)
declare @row int
declare @in_id int
declare @unit varchar(10)
declare @price decimal(12,2)
declare @amount int 
declare @item_type varchar(10)
declare @rcd_person varchar(50)
declare @kd_date datetime
declare @kd_person varchar(50)
declare @kd_dept varchar(50)
declare @drug_dept varchar(50)
declare @issue_date datetime 
declare @issue_person varchar(50)
declare @page_num int
declare @page_row int
declare @useway varchar(150)
declare @group_amount int
declare @pat_name varchar(50)
declare @spellshort varchar(50)
declare @sex varchar(10)
declare @birth_date datetime
declare @dept_name varchar(150)
declare @bed_name varchar(150)
declare @typ_name varchar(150)
declare @med_no varchar(50)
declare @med_name varchar(200)
declare @specification varchar(200)
declare @mnu_name varchar(200)
declare @keep_date datetime
declare @i int
declare @useway_prep varchar(150)
declare @p_seq int
declare @pd_seq int
declare @pc int
declare @in_seq_prep int
declare @row_seq int

declare @row_content varchar(250)
declare @med_content varchar(250)
declare @unit_dose decimal(12,2)
declare @dose_unit varchar(50)
declare @start_date datetime
declare @start_doctor_pername varchar(50)
declare @stop_date datetime
declare @stop_doctor_pername varchar(50)
declare @kj varchar(50)
declare @cls_no varchar(50)
declare @small_unit_dose decimal(12,2)
declare @zx_zq int

set @useway_prep=''
set @p_seq=1
set @pc=1
set @in_seq_prep=1
set @pd_seq=1
set @row_seq=1

create table #tmpadvice(in_seq int not null,
use_dept varchar(50) null,
rcd_date datetime null,
long_id char(1) null,
row int null,
in_id int null,
unit varchar(10) null,
price decimal(12,2) null,
amount int null,
item_type varchar(10) null,
rcd_person varchar(50) null,
kd_date datetime null,
kd_person varchar(50) null,
kd_dept varchar(50) null,
drug_dept varchar(50) null,
issue_date datetime null,
issue_person varchar(50) null,
page_num int null,
page_row int null,
useway varchar(150) null,
group_amount int null,
pat_name varchar(50) null,
spellshort varchar(50) null,
sex varchar(10) null,
birth_date datetime null,
dept_name varchar(50) null,
bed_name varchar(50) null,
typ_name varchar(50) null,
med_no varchar(50) null,
med_name varchar(150) null,
specification varchar(150) null,
mnu_name varchar(150) null,
keep_date datetime null
)



------解决思路----------------------
这不仅是调优(索引调整)了,还得改写代码了
------解决思路----------------------
游标里都是一条条数据insert
这样肯定慢
得想办法批量插入
------解决思路----------------------
在过程开始的时候定义开始时间变量,开始时间为当前时间,后续的每一步都打印一下每一步的时间,对耗时比较长的SQL进行处理;打印语句为:PRINT '步骤1.耗时:' + CONVERT(VARCHAR(20),DATEDIFF(millisecond,@开始时间,GETDATE()))
------解决思路----------------------
看起来不需要游标可以解决的,就是一些判断。
根据不同的判断形成不同的“数据集”,然后表连接批量插入。
------解决思路----------------------
1、尽量少用游标
2、在保证不会出现 脏读、幻读 的前提下  with(nolock)
3、做好索引

我大概就想到这么多  
------解决思路----------------------
还有就是 where 后面少用函数
------解决思路----------------------
你这个存储过程写得 平铺直叙 啊啊 倒也看得清楚
但是应该以批量操作为主,你这么一条一条的循环如果可以避免还是尽量避免的好

------解决思路----------------------
大概看了一下,慢可能是慢在你一次查询关联8个表那里了,你可以用2个临时表分别插入4个表关联的结果,再进行关联看看