通过oracle 自动优化任务dbms_sqltune进行SQL优化的实战

  • 服务概述

用户的数据库系统在2026年3月31日上午排业务部门反馈,HIS数据库一条语句查询卡顿,运行速度较慢,影响了正常的业务。在此情况下需要排查出问题的深层原因,从而从根本上解决问题。

工程师在发现语句卡顿后,及时进行响应,通过相应的性能数据信息对数据库及问题进行分析排查,通过对数据库历史性能信息进行分析,明确问题原因并针对性的提出了优化建议;根据整个排查分析过程汇总整理此文档。

  • 问题分析
    1. 空间问题
      1. 服务器本地空间

服务器本地空间使用率正常。

      1. 查看CPU使用率

服务器CPU使用率正常。

    1. 数据库AWR报告分析

客户反馈该语句卡顿

首要瓶颈:单次执行耗时极长的SQL

SQL ID: bsbjasa37qr7u

问题: 这条SQL虽然只执行了1次,但其单次执行耗时高达 1,557.35秒 (约26分钟),占总消耗时间的 4.77%。这是一个非常严重的性能问题,需要立即关注。

  • 处理过程
    1. 问题分析总结

通过对AWR报告和操作系统分析,可以发现这条SQL虽然只执行了1次,但其单次执行耗时高达 1,557.35秒 (约26分钟),SQL语句需要进行优化处理。

    1. 处理建议
  1. 优化业务语句
    1.
    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.name,

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")


      1. 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 以锁定最优执行路径。

相关推荐
qq_654366982 小时前
CSS如何处理@import样式表的嵌套加载_评估递归对加载的影响
jvm·数据库·python
weixin_381288182 小时前
苹果微软双修党福音:Navicat如何跨系统平滑迁移配置
jvm·数据库·python
NineData2 小时前
NineData将亮相DACon 2026上海站!解锁AGI时代数据“智理”新范式
数据库·后端·架构
川石课堂软件测试2 小时前
软件测试:典型面试题库
数据库·python·功能测试·mysql·单元测试·grafana·prometheus
of Watermelon League2 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
忍冬行者2 小时前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
qq_342295823 小时前
CSS如何制作点击展开时的手风琴动画_平滑过渡max-height高度
jvm·数据库·python
Lucifer三思而后行3 小时前
zCloud 纳管 MySQL 8.4 数据库
数据库·mysql·oracle
我是菜菜呀呃3 小时前
达梦数据库日常运维SQL和问题排查
数据库