- 服务概述
用户的数据库系统在2026年3月31日上午排业务部门反馈,HIS数据库一条语句查询卡顿,运行速度较慢,影响了正常的业务。在此情况下需要排查出问题的深层原因,从而从根本上解决问题。
工程师在发现语句卡顿后,及时进行响应,通过相应的性能数据信息对数据库及问题进行分析排查,通过对数据库历史性能信息进行分析,明确问题原因并针对性的提出了优化建议;根据整个排查分析过程汇总整理此文档。
- 问题分析
- 空间问题
- 服务器本地空间
- 空间问题
服务器本地空间使用率正常。
-
-
- 查看CPU使用率
-
服务器CPU使用率正常。
-
- 数据库AWR报告分析
客户反馈该语句卡顿
首要瓶颈:单次执行耗时极长的SQL
SQL ID: bsbjasa37qr7u
问题: 这条SQL虽然只执行了1次,但其单次执行耗时高达 1,557.35秒 (约26分钟),占总消耗时间的 4.77%。这是一个非常严重的性能问题,需要立即关注。
- 处理过程
- 问题分析总结
通过对AWR报告和操作系统分析,可以发现这条SQL虽然只执行了1次,但其单次执行耗时高达 1,557.35秒 (约26分钟),SQL语句需要进行优化处理。
-
- 处理建议
- 优化业务语句
1.- SQL优化过程
利用oracle自带的sql自动优化功能,对需要优化的sql进行处理。
SQL> set long 999999
SQL> set LONGCHUNKSIZE 999999
SQL> set serveroutput on size 999999
SQL> set linesize 200 pagesize 1000
SQL> SELECT dbms_sqltune.report_tuning_task('TASK_348499') FROM dual;
DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_348499')
GENERAL INFORMATION SECTION
Tuning Task Name : TASK_348499
Tuning Task Owner : SYS
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status : COMPLETED
Started at : 03/31/2026 10:26:36
Completed at : 03/31/2026 10:27:20
Schema Name: ZJHIS
SQL ID : 8mupz6ybr3huu
SQL Text : --3115030190077ʾϸ
SELECT distinct B.PATIENT_NO,
b.bah,
b.social_id,
T.Jz_Date ʱ
..................
AND z.CHARGE_DATE between
to_date('2024-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
and
to_date('2024-06-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
and z.charge_code in(1377)
--
and z.old_jlxh is null
and z.jlxh not in
(select z.old_jlxh
from ZY_DETAIL_CHARGE z
where z.CHARGE_DATE between
to_date('2024-01-01 00:00:00', 'YYYY-MM-DD
HH24:MI:SS') and
to_date('2024-06-30 23:59:59', 'YYYY-MM-DD
HH24:MI:SS')
and z.old_jlxh is not null)
order by b.patient_no,trunc(z.charge_date)
FINDINGS SECTION (2 findings)
1- SQL Profile Finding (see explain plans section below)
A potentially better execution plan was found for this statement.
Recommendation (estimated benefit: 96.43%)
- Consider accepting the recommended SQL profile.
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_348499',
task_owner => 'SYS', replace => TRUE);
2- Index Finding (see explain plans section below)
The execution plan of this statement can be improved by creating one or more
indices.
Recommendation (estimated benefit: 99.75%)
- Consider running the Access Advisor to improve the physical schema design
or creating the recommended index.
create index ZJHIS.IDX$$_551530001 on
ZJHIS.ZY_SFFLXX("PATIENT_NO","PINGTAIID");
- Consider running the Access Advisor to improve the physical schema design
or creating the recommended index.
create index SIIM.IDX$$_551530002 on SIIM.YB_ZYDJXX(TO_NUMBER("YYZYHM"));
Rationale
Creating the recommended indices significantly improves the execution plan
of this statement. However, it might be preferable to run "Access Advisor"
using a representative SQL workload as opposed to a single statement. This
will allow to get comprehensive index recommendations which takes into
account index maintenance overhead and additional space consumption.
EXPLAIN PLANS SECTION
1- Original With Adjusted Cost
Plan hash value: 3649751971
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 427 | 598K (1)| 01:59:46 |
| 1 | SORT GROUP BY | | 1 | 25 | | |
| 2 | TABLE ACCESS BY INDEX ROWID | BL_BINGRENZDQK | 3 | 75 | 5 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | INDEX_BL_BINGRENZDQK | 3 | | 3 (0)| 00:00:01 |
| 4 | SORT GROUP BY | | 1 | 17 | | |
| 5 | TABLE ACCESS BY INDEX ROWID | ZY_ZDXX | 5 | 85 | 5 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | PK_ZY_ZDXX | 5 | | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 11 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | IDX_GY_BRXZ_BRLB_YBXZ1 | 1 | 27 | 2 (0)| 00:00:01 |
| 14 | SORT ORDER BY | | 1 | 427 | 598K (1)| 01:59:46 |
| 15 | HASH UNIQUE | | 1 | 427 | 598K (1)| 01:59:46 |
| 16 | NESTED LOOPS | | 1 | 427 | 598K (1)| 01:59:45 |
| 17 | NESTED LOOPS | | 13 | 427 | 598K (1)| 01:59:45 |
| 18 | NESTED LOOPS | | 1 | 362 | 598K (1)| 01:59:39 |
| 19 | NESTED LOOPS | | 50 | 15550 | 598K (1)| 01:59:39 |
| 20 | NESTED LOOPS | | 50 | 14100 | 598K (1)| 01:59:37 |
| 21 | NESTED LOOPS ANTI | | 2885 | 546K| 592K (1)| 01:58:28 |
|* 22 | TABLE ACCESS BY INDEX ROWID| ZY_DETAIL_CHARGE | 288K| 50M| 5 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | INDEX_CHARGE_DATE | 1 | | 4 (0)| 00:00:01 |
|* 24 | TABLE ACCESS BY INDEX ROWID| ZY_DETAIL_CHARGE | 104K| 1024K| 8 (0)| 00:00:01 |
|* 25 | INDEX RANGE SCAN | PK_ZY_DEATAIL_OLD_JLXH | 9 | | 2 (0)| 00:00:01 |
|* 26 | TABLE ACCESS BY INDEX ROWID | ZY_PATIENT_INFORMATION | 1 | 88 | 2 (0)| 00:00:01 |
|* 27 | INDEX UNIQUE SCAN | PK_ZY_PATIENT_INFORMATION | 1 | | 1 (0)| 00:00:01 |
| 28 | TABLE ACCESS BY INDEX ROWID | ZY_TOTAL_FEE | 1 | 29 | 3 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN | PK_ZY_TOTAL_FEE_PJI | 1 | | 2 (0)| 00:00:01 |
|* 30 | TABLE ACCESS BY INDEX ROWID | YB_ZYJSXX | 1 | 51 | 1 (0)| 00:00:01 |
|* 31 | INDEX UNIQUE SCAN | PK_YB_ZYJSXX | 1 | | 0 (0)| 00:00:01 |
|* 32 | INDEX RANGE SCAN | IDX_YB_ZYDJXX_1 | 13 | | 495 (1)| 00:00:06 |
|* 33 | TABLE ACCESS BY INDEX ROWID | YB_ZYDJXX | 1 | 65 | 503 (1)| 00:00:07 |
Predicate Information (identified by operation id):
3 - access("T"."BRXH"=:B1)
filter("T"."ZDLB"=3 OR "T"."ZDLB"=4)
6 - access("X"."PATIENT_NO"=:B1)
7 - filter("FLYWMC"='ZJE198')
8 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
9 - filter("FLYWMC"='*JINE07198')
10 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
11 - filter("FLYWMC"='*JINE05198')
12 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
13 - access("XZDM"=:B1 AND "BRLB"=98)
filter("BRLB"=98)
22 - filter("Z"."OLD_JLXH" IS NULL)
23 - access("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"Z"."CHARGE_CODE"=1377 AND "Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
filter("Z"."CHARGE_CODE"=1377)
24 - filter("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
25 - access("Z"."JLXH"="Z"."OLD_JLXH")
filter("Z"."OLD_JLXH" IS NOT NULL)
26 - filter("B"."YBJYLSH" IS NOT NULL AND SUBSTR("B"."BAH",1,1)<>'Q' AND "B"."BRLB"<>1 AND
"Z"."JS_NO"="B"."JS_NO")
27 - access("Z"."PATIENT_NO"="B"."PATIENT_NO")
29 - access("B"."PATIENT_NO"="T"."PATIENT_NO" AND "B"."JS_NO"="T"."JS_NO")
30 - filter("C"."YLBXID"=600 AND "C"."JYCXBZ"=0 AND "C"."YBQRBZ"=1 AND
"T"."PATIENT_NO"=TO_NUMBER("C"."YYZYHM"))
31 - access("C"."ZYJSID"=TO_NUMBER("T"."YBJYLSH"))
32 - access("D"."YLBXID"=600)
filter("B"."PATIENT_NO"=TO_NUMBER("D"."YYZYHM"))
33 - filter("D"."ZYDJZT"=1 AND "D"."YBQRBZ"=1)
2- Using SQL Profile
Plan hash value: 3095748882
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 23 | 9821 | 21340 (1)| 00:04:17 |
| 1 | SORT GROUP BY | | 1 | 25 | | |
| 2 | TABLE ACCESS BY INDEX ROWID | BL_BINGRENZDQK | 3 | 75 | 5 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | INDEX_BL_BINGRENZDQK | 3 | | 3 (0)| 00:00:01 |
| 4 | SORT GROUP BY | | 1 | 17 | | |
| 5 | TABLE ACCESS BY INDEX ROWID | ZY_ZDXX | 5 | 85 | 5 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | PK_ZY_ZDXX | 5 | | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 11 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | PK_ZY_SFFLXX | 1 | | 3 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | IDX_GY_BRXZ_BRLB_YBXZ1 | 1 | 27 | 2 (0)| 00:00:01 |
| 14 | SORT ORDER BY | | 23 | 9821 | 21340 (1)| 00:04:17 |
| 15 | HASH UNIQUE | | 23 | 9821 | 21339 (1)| 00:04:17 |
|* 16 | HASH JOIN | | 23 | 9821 | 21338 (1)| 00:04:17 |
| 17 | NESTED LOOPS ANTI | | 23 | 8326 | 18871 (1)| 00:03:47 |
|* 18 | HASH JOIN | | 2307 | 793K| 14134 (1)| 00:02:50 |
| 19 | NESTED LOOPS | | 1470 | 241K| 14129 (1)| 00:02:50 |
| 20 | NESTED LOOPS | | 1470 | 241K| 14129 (1)| 00:02:50 |
| 21 | NESTED LOOPS | | 1390 | 108K| 11353 (1)| 00:02:17 |
|* 22 | TABLE ACCESS BY INDEX ROWID| YB_ZYJSXX | 2728 | 135K| 3168 (1)| 00:00:39 |
|* 23 | INDEX SKIP SCAN | PK_YB_ZYJSXX_YYZYHM | 2838 | | 397 (0)| 00:00:05 |
|* 24 | TABLE ACCESS BY INDEX ROWID| ZY_TOTAL_FEE | 1 | 29 | 3 (0)| 00:00:01 |
|* 25 | INDEX RANGE SCAN | IDX_ZY_TOTAL_FEE_PATNO | 1 | | 2 (0)| 00:00:01 |
|* 26 | INDEX UNIQUE SCAN | PK_ZY_PATIENT_INFORMATION | 1 | | 1 (0)| 00:00:01 |
|* 27 | TABLE ACCESS BY INDEX ROWID | ZY_PATIENT_INFORMATION | 1 | 88 | 2 (0)| 00:00:01 |
|* 28 | TABLE ACCESS BY INDEX ROWID | ZY_DETAIL_CHARGE | 288K| 50M| 5 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN | INDEX_CHARGE_DATE | 1 | | 4 (0)| 00:00:01 |
|* 30 | TABLE ACCESS BY INDEX ROWID | ZY_DETAIL_CHARGE | 104K| 1024K| 8 (0)| 00:00:01 |
|* 31 | INDEX RANGE SCAN | PK_ZY_DEATAIL_OLD_JLXH | 9 | | 2 (0)| 00:00:01 |
|* 32 | TABLE ACCESS FULL | YB_ZYDJXX | 8135 | 516K| 2467 (1)| 00:00:30 |
Predicate Information (identified by operation id):
3 - access("T"."BRXH"=:B1)
filter("T"."ZDLB"=3 OR "T"."ZDLB"=4)
6 - access("X"."PATIENT_NO"=:B1)
7 - filter("FLYWMC"='ZJE198')
8 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
9 - filter("FLYWMC"='*JINE07198')
10 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
11 - filter("FLYWMC"='*JINE05198')
12 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
13 - access("XZDM"=:B1 AND "BRLB"=98)
filter("BRLB"=98)
16 - access("B"."PATIENT_NO"=TO_NUMBER("D"."YYZYHM"))
18 - access("Z"."PATIENT_NO"="B"."PATIENT_NO" AND "Z"."JS_NO"="B"."JS_NO")
22 - filter("C"."JYCXBZ"=0 AND "C"."YBQRBZ"=1)
23 - access("C"."YLBXID"=600)
filter("C"."YLBXID"=600)
24 - filter("C"."ZYJSID"=TO_NUMBER("T"."YBJYLSH"))
25 - access("T"."PATIENT_NO"=TO_NUMBER("C"."YYZYHM"))
26 - access("B"."PATIENT_NO"="T"."PATIENT_NO")
27 - filter("B"."YBJYLSH" IS NOT NULL AND SUBSTR("B"."BAH",1,1)<>'Q' AND "B"."BRLB"<>1 AND
"B"."JS_NO"="T"."JS_NO")
28 - filter("Z"."OLD_JLXH" IS NULL)
29 - access("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"Z"."CHARGE_CODE"=1377 AND "Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
filter("Z"."CHARGE_CODE"=1377)
30 - filter("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
31 - access("Z"."JLXH"="Z"."OLD_JLXH")
filter("Z"."OLD_JLXH" IS NOT NULL)
32 - filter("D"."ZYDJZT"=1 AND "D"."YBQRBZ"=1 AND "D"."YLBXID"=600)
3- Using New Indices
Plan hash value: 590393392
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
| 0 | SELECT STATEMENT | | 33 | 14091 | 51 (2)| 00:00:01 | | | |
| 1 | SORT GROUP BY | | 1 | 25 | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | BL_BINGRENZDQK | 3 | 75 | 5 (0)| 00:00:01 | | | |
|* 3 | INDEX RANGE SCAN | INDEX_BL_BINGRENZDQK | 3 | | 3 (0)| 00:00:01 | | | |
| 4 | SORT GROUP BY | | 1 | 17 | | | | | |
| 5 | PX COORDINATOR | | | | | | | | |
| 6 | PX SEND QC (RANDOM) | :TQ10000 | 5 | 85 | 5 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 7 | PX BLOCK ITERATOR | | 5 | 85 | 5 (0)| 00:00:01 | Q1,00 | PCWC | |
|* 8 | TABLE ACCESS FULL | ZY_ZDXX | 5 | 85 | 5 (0)| 00:00:01 | Q1,00 | PCWP | |
|* 9 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 | | | |
|* 10 | INDEX RANGE SCAN | IDX$$_551530001 | 1 | | 3 (0)| 00:00:01 | | | |
|* 11 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 | | | |
|* 12 | INDEX RANGE SCAN | IDX$$_551530001 | 1 | | 3 (0)| 00:00:01 | | | |
|* 13 | TABLE ACCESS BY INDEX ROWID | ZY_SFFLXX | 1 | 27 | 4 (0)| 00:00:01 | | | |
|* 14 | INDEX RANGE SCAN | IDX$$_551530001 | 1 | | 3 (0)| 00:00:01 | | | |
| 15 | PX COORDINATOR | | | | | | | | |
| 16 | PX SEND QC (RANDOM) | :TQ20000 | 1 | 27 | 2 (0)| 00:00:01 | Q2,00 | P->S | QC (RAND) |
| 17 | PX BLOCK ITERATOR | | 1 | 27 | 2 (0)| 00:00:01 | Q2,00 | PCWC | |
|* 18 | INDEX FAST FULL SCAN | IDX_GY_BRXZ_BRLB_YBXZ1 | 1 | 27 | 2 (0)| 00:00:01 | Q2,00 | PCWP | |
| 19 | PX COORDINATOR | | | | | | | | |
| 20 | PX SEND QC (ORDER) | :TQ30003 | 33 | 14091 | 51 (2)| 00:00:01 | Q3,03 | P->S | QC (ORDER) |
| 21 | SORT ORDER BY | | 33 | 14091 | 51 (2)| 00:00:01 | Q3,03 | PCWP | |
| 22 | PX RECEIVE | | 33 | 14091 | 50 (0)| 00:00:01 | Q3,03 | PCWP | |
| 23 | PX SEND RANGE | :TQ30002 | 33 | 14091 | 50 (0)| 00:00:01 | Q3,02 | P->P | RANGE |
| 24 | NESTED LOOPS | | 33 | 14091 | 50 (0)| 00:00:01 | Q3,02 | PCWP | |
| 25 | NESTED LOOPS ANTI | | 23 | 8326 | 50 (0)| 00:00:01 | Q3,02 | PCWP | |
|* 26 | HASH JOIN | | 2307 | 793K| 41 (0)| 00:00:01 | Q3,02 | PCWP | |
| 27 | PX RECEIVE | | 1470 | 241K| 36 (0)| 00:00:01 | Q3,02 | PCWP | |
| 28 | PX SEND HASH | :TQ30001 | 1470 | 241K| 36 (0)| 00:00:01 | Q3,01 | P->P | HASH |
| 29 | NESTED LOOPS | | 1470 | 241K| 36 (0)| 00:00:01 | Q3,01 | PCWP | |
| 30 | NESTED LOOPS | | 1470 | 241K| 36 (0)| 00:00:01 | Q3,01 | PCWP | |
| 31 | NESTED LOOPS | | 1390 | 108K| 31 (0)| 00:00:01 | Q3,01 | PCWP | |
| 32 | PX BLOCK ITERATOR | | | | | | Q3,01 | PCWC | |
|* 33 | TABLE ACCESS FULL | YB_ZYJSXX | 2728 | 135K| 15 (0)| 00:00:01 | Q3,01 | PCWP | |
|* 34 | TABLE ACCESS BY INDEX ROWID| ZY_TOTAL_FEE | 1 | 29 | 0 (0)| 00:00:01 | Q3,01 | PCWP | |
|* 35 | INDEX RANGE SCAN | IDX_ZY_TOTAL_FEE_PATNO | 1 | | 0 (0)| 00:00:01 | Q3,01 | PCWP | |
|* 36 | INDEX UNIQUE SCAN | PK_ZY_PATIENT_INFORMATION | 1 | | 0 (0)| 00:00:01 | Q3,01 | PCWP | |
|* 37 | TABLE ACCESS BY INDEX ROWID | ZY_PATIENT_INFORMATION | 1 | 88 | 0 (0)| 00:00:01 | Q3,01 | PCWP | |
| 38 | BUFFER SORT | | | | | | Q3,02 | PCWC | |
| 39 | PX RECEIVE | | 288K| 50M| 5 (0)| 00:00:01 | Q3,02 | PCWP | |
| 40 | PX SEND HASH | :TQ30000 | 288K| 50M| 5 (0)| 00:00:01 | | S->P | HASH |
|* 41 | TABLE ACCESS BY INDEX ROWID | ZY_DETAIL_CHARGE | 288K| 50M| 5 (0)| 00:00:01 | | | |
|* 42 | INDEX RANGE SCAN | INDEX_CHARGE_DATE | 1 | | 4 (0)| 00:00:01 | | | |
|* 43 | TABLE ACCESS BY INDEX ROWID | ZY_DETAIL_CHARGE | 104K| 1024K| 0 (0)| 00:00:01 | Q3,02 | PCWP | |
|* 44 | INDEX RANGE SCAN | PK_ZY_DEATAIL_OLD_JLXH | 9 | | 0 (0)| 00:00:01 | Q3,02 | PCWP | |
|* 45 | TABLE ACCESS BY INDEX ROWID | YB_ZYDJXX | 1 | 65 | 7 (0)| 00:00:01 | Q3,02 | PCWP | |
|* 46 | INDEX RANGE SCAN | IDX$$_551530002 | 11 | | 1 (0)| 00:00:01 | Q3,02 | PCWP | |
Predicate Information (identified by operation id):
3 - access("T"."BRXH"=:B1)
filter("T"."ZDLB"=3 OR "T"."ZDLB"=4)
8 - filter("X"."PATIENT_NO"=:B1)
9 - filter("FLYWMC"='ZJE198')
10 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
11 - filter("FLYWMC"='*JINE07198')
12 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
13 - filter("FLYWMC"='*JINE05198')
14 - access("PATIENT_NO"=:B1 AND "PINGTAIID"=:B2)
18 - filter("XZDM"=:B1 AND "BRLB"=98)
26 - access("Z"."PATIENT_NO"="B"."PATIENT_NO" AND "Z"."JS_NO"="B"."JS_NO")
33 - filter("C"."YLBXID"=600 AND "C"."JYCXBZ"=0 AND "C"."YBQRBZ"=1)
34 - filter("C"."ZYJSID"=TO_NUMBER("T"."YBJYLSH"))
35 - access("T"."PATIENT_NO"=TO_NUMBER("C"."YYZYHM"))
36 - access("B"."PATIENT_NO"="T"."PATIENT_NO")
37 - filter("B"."YBJYLSH" IS NOT NULL AND SUBSTR("B"."BAH",1,1)<>'Q' AND "B"."BRLB"<>1 AND "B"."JS_NO"="T"."JS_NO")
41 - filter("Z"."OLD_JLXH" IS NULL)
42 - access("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "Z"."CHARGE_CODE"=1377 AND
"Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
filter("Z"."CHARGE_CODE"=1377)
43 - filter("Z"."CHARGE_DATE">=TO_DATE(' 2024-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "Z"."CHARGE_DATE"<=TO_DATE(' 2024-06-30
23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
44 - access("Z"."JLXH"="Z"."OLD_JLXH")
filter("Z"."OLD_JLXH" IS NOT NULL)
45 - filter("D"."ZYDJZT"=1 AND "D"."YBQRBZ"=1 AND "D"."YLBXID"=600)
46 - access("B"."PATIENT_NO"="YB_ZYDJXX"."qsmmix_VCol_5001")
-
-
- SQL优化结论
-
报告共发现 2 项主要优化建议,预估能显著降低查询成本:
1.. 创建 SQL Profile (预估收益 96.43%)
建议内容:接受推荐的 SQL Profile。
执行语句:
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_348499',task_owner => 'SYS', replace => TRUE);
作用:通过绑定执行计划,利用更优的查询路径(如调整表连接顺序)来大幅提升性能。
2. 创建缺失索引 (预估收益 99.75%)
建议一:在表 ZJHIS.ZY_SFFLXX 上创建复合索引。
索引定义:create index ZJHIS.IDX$$_551530001 on ZJHIS.ZY_XX("PATIENT_NO","PINGTAIID") ONLINE;
建议二:在表 SIIM.YB_ZYDJXX 上创建函数索引。
索引定义:create index SIIM.IDX$$_551530002 on SIIM.YB_XXXX(TO_NUMBER("YYZYHM"));
作用:消除全表扫描,通过索引快速定位数据,从而大幅降低 I/O 成本。
- 总结与建议
该 SQL 语句目前存在严重的性能瓶颈,主要原因是缺乏合适的索引以及执行计划非最优。
推荐操作步骤:
优先创建索引:先执行报告中建议的两个 CREATE INDEX 语句。这不仅能解决当前 SQL 的性能问题,还可能惠及数据库中其他相关的查询。
****应用 SQL Profile:****在创建索引后,如果执行计划仍未自动优化,再应用 SQL Profile 以锁定最优执行路径。