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里边还能写成个查询?