update 语句执行慢优化后老报错请高手指教

liulianxin 2011-08-08 11:59:43
执行慢的语句
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
请高手指教,谢谢。
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangqm22 2011-08-10
  • 打赏
  • 举报
回复
更新一次大约更新多少条数据?
ayanamiliu 2011-08-10
  • 打赏
  • 举报
回复
用游标对远程和本地的开销是最小的,游标遍历更新吧
momotou11 2011-08-10
  • 打赏
  • 举报
回复
第二条语句能跑么?update里边还能写成个查询?
momotou11 2011-08-10
  • 打赏
  • 举报
回复
说实话看到join的写法就头大啊,看起来好费劲。

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

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

你得给出表的具体索引、分区和当时oracle优化器的执行计划。
lgjlry 2011-08-09
  • 打赏
  • 举报
回复
第二条语句有时候对,有时候错。
liulianxin 2011-08-09
  • 打赏
  • 举报
回复
我自身的数据库数据量不大,就一百多条记录。但远程数据库的数据库可能大一些,还有就是我写的第二个语句是对的吗,老是执行不过去,每二个语句和第一个语句效率是不是会高一些。
meegowei1 2011-08-08
  • 打赏
  • 举报
回复
如果 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 这个表
灰哥 2011-08-08
  • 打赏
  • 举报
回复
唉,你又要更新,而且又要连别个远程的数据库(我看你用的是db_link)慢点是正常的。
顶住。。。
yjytiantang 2011-08-08
  • 打赏
  • 举报
回复
如果數據量大的話,可以采取綁定變量的寫法,減少硬解析次數~~這樣會好一些~

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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