首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

update 语句执行慢优化后老报错请高手指教,该怎么解决

2012-02-29 
update 语句执行慢优化后老报错请高手指教执行慢的语句UpdateDIAGNOSIS@hiscs aset (DIAGNOSIS_TYPE,----

update 语句执行慢优化后老报错请高手指教
执行慢的语句
Update DIAGNOSIS@hiscs a
set (DIAGNOSIS_TYPE,---- 诊断类别
  DIAGNOSIS_NO,---- 诊断序号
  DIAGNOSIS_DESC,---- 诊断
  DIAGNOSIS_DATE,---- 诊断日期
  TREAT_DAYS,---- 治疗天数
  TREAT_RESULT,---- 治疗结果
  OPER_TREAT_INDICATOR,---- 手术治疗标志
  DIAGNOSIS_CODE,---- 诊断代码
  INSERT_INDICATOR)=(Select
  b.DIAG_TYPE ,---- 诊断类别
  b.DIAGNOSIS_NO,---- 诊断序号
  SUBSTR(b.DIAG_DESC,1,40),---- 诊断
  b.DIAG_DATE,---- 诊断日期
  b.DOCTOR_DAYS,---- 治疗天数
  b.DOCTOR_RESULT,---- 治疗结果
  b.OPER_DOCTOR,---- 手术治疗标志
  b.DIAG_NO,---- 诊断代码
  b.INSERT_INDICATOR
  From V_EMR_DIAG b
  Where b.NAD IS NOT NULL AND
  a.PATIENT_ID=b.PATIENT_ID And
  a.VISIT_ID=b.NAD And
  a.DIAGNOSIS_TYPE=b.DIAG_TYPE And
  a.DIAGNOSIS_NO=b.DIAGNOSIS_NO )
Where exists(Select PATIENT_ID---- 病人标识
From V_EMR_DIAG
  Where V_EMR_DIAG.NAD IS NOT NULL AND
  a.PATIENT_ID=V_EMR_DIAG.PATIENT_ID And
  a.VISIT_ID=V_EMR_DIAG.NAD And
  a.DIAGNOSIS_TYPE=V_EMR_DIAG.DIAG_TYPE And
  a.DIAGNOSIS_NO=V_EMR_DIAG.DIAGNOSIS_NO
  );

改后的语句

 Update 
(Select a.DIAGNOSIS_TYPE,---- 诊断类别
a.DIAGNOSIS_NO,---- 诊断序号
a.DIAGNOSIS_DESC,---- 诊断
a.DIAGNOSIS_DATE,---- 诊断日期
a.TREAT_DAYS,---- 治疗天数
a.TREAT_RESULT,---- 治疗结果
a.OPER_TREAT_INDICATOR,---- 手术治疗标志
a.DIAGNOSIS_CODE,---- 诊断代码
a.INSERT_INDICATOR,
  b.DIAG_TYPE ,---- 诊断类别
  b.DIAGNOSIS_NO as zdxh,---- 诊断序号
  b.DIAG_DESC,---- 诊断
  b.DIAG_DATE,---- 诊断日期
  b.DOCTOR_DAYS,---- 治疗天数
  b.DOCTOR_RESULT,---- 治疗结果
  b.OPER_DOCTOR,---- 手术治疗标志
  b.DIAG_NO,---- 诊断代码
  b.INSERT_INDICATOR as aa
  From V_EMR_DIAG b left join DIAGNOSIS@hiscs a on 
  a.PATIENT_ID=b.PATIENT_ID And
  a.VISIT_ID=b.NAD And
  a.DIAGNOSIS_TYPE=b.DIAG_TYPE And
  a.DIAGNOSIS_NO=b.DIAGNOSIS_NO
  Where b.NAD IS NOT NULL AND 
  b.DIAG_TYPE is not null 
  )


set a.DIAGNOSIS_TYPEO=b.DIAG_TYPE,
a.DIAGNOSIS_NO=b.zdxh,
a.DIAGNOSIS_DESC=b.DIAG_DESC,
  a.DIAGNOSIS_DATE=b.DIAG_DATE,
aTREAT_DAYS=b.DOCTOR_DAYS,
a.TREAT_RESULT=b.DOCTOR_RESULT,
a.OPER_TREAT_INDICATOR=b.OPER_DOCTOR,
a.DIAGNOSIS_CODE=b.DIAG_NO,
  a.INSERT_INDICATOR=b.AA


请高手指教,谢谢。

[解决办法]
如果數據量大的話,可以采取綁定變量的寫法,減少硬解析次數~~這樣會好一些~
[解决办法]
如果 PATIENT_ID 是主关键字的话(有索引也可),建议写一个 存储过程,思咱如下:

1. 定义一个 游标, Select PATIENT_ID---- 病人标识
From V_EMR_DIAG
Where V_EMR_DIAG.NAD IS NOT NULL AND
a.PATIENT_ID=V_EMR_DIAG.PATIENT_ID And
a.VISIT_ID=V_EMR_DIAG.NAD And
a.DIAGNOSIS_TYPE=V_EMR_DIAG.DIAG_TYPE And
a.DIAGNOSIS_NO=V_EMR_DIAG.DIAGNOSIS_NO

2. 遍历 这个 游标 来 update 这个表

[解决办法]
说实话看到join的写法就头大啊,看起来好费劲。

单纯从表面看,一般情况下还不如第一个呢。

而且你这第二个用了外链,我都怀疑你跑出来的结果和第一个还一样不?

你得给出表的具体索引、分区和当时oracle优化器的执行计划。
[解决办法]
第二条语句能跑么?update里边还能写成个查询?

热点排行