多表联合查询优化

雪舞芳茕 2020-06-10 04:53:36

SELECT DISTINCT
A.PATIENT_ID,A.VISIT_ID,B.NAME,B.INP_NO,C.ADMISSION_DATE_TIME,C.DEPT_ADMISSION_TO,C.charge_type,D.DEPT_NAME
FROM INP_BILL_DETAIL A,PAT_MASTER_INDEX B,PAT_VISIT C,DEPT_DICT D
WHERE
(A .PATIENT_ID = B.PATIENT_ID)
AND (A .PATIENT_ID = C.PATIENT_ID) AND (A .VISIT_ID = C.VISIT_ID)
AND A .RCPT_NO IS NULL
AND A .PATIENT_ID NOT IN (SELECT PATIENT_ID FROM PATS_IN_HOSPITAL)
AND SUBSTR (A .ORDERED_BY, 1, 4) = '" + ward_code + @"'
AND D.DEPT_CODE = C.DEPT_ADMISSION_TO
ORDER BY ADMISSION_DATE_TIME desc



A表数据量3000W条,B表70W,C表17W,D表100条,求大神帮忙优化一下
...全文
161 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxfamly 2020-06-11
  • 打赏
  • 举报
回复
A表全表扫描,看看有没有可利用的索引,如果ORDERED_BY是索引的话,建议改成like,或者像楼上说的建一个函数索引。
另外A.PATIENT_ID、B.PATIENT_ID、C.PATIENT_ID、A.VISIT_ID 、C.VISIT_ID最好是索引
当然,最终要根据业务实际情况判断,表索引不能太多
lhdz_bj 2020-06-10
  • 打赏
  • 举报
回复
最大的表走了FTS,建个函数索引试试呢。
create index ind_sub_ord14 on INP_BILL_DETAIL(SUBSTR (ORDERED_BY, 1, 4));
雪舞芳茕 2020-06-10
  • 打赏
  • 举报
回复
引用 1 楼 lhdz_bj 的回复:
这个得看执行计划,不然,就是猜。
执行计划贴出来了
雪舞芳茕 2020-06-10
  • 打赏
  • 举报
回复
lhdz_bj 2020-06-10
  • 打赏
  • 举报
回复
这个得看执行计划,不然,就是猜。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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