计算机系统应用教程网站

网站首页 > 技术文章 正文

分享一个Oracle数据库sql优化实例--cost由32793降为3

btikc 2024-08-31 17:10:45 技术文章 12 ℃ 0 评论

概述

最近比较有空,所以看了一些问题sql,顺便优化一下,做个简单记录。


问题sql

SQL(c212jfrj1m0fg) 在采样期平均单次执行逻辑读为 106205.83, 其最新执行计划涉及 2 个对象,平均单个对象的逻辑读较大。

在其最新执行计划中,发现较差的执行步骤:

2:TABLE ACCESS FULL (TABLE:RFUSER.FSL_OR [953.44 MB]);

1、查看具体sql:

select listagg(sql_text,' ') within group (order by piece)
 from v$sqltext
 where sql_id = 'c212jfrj1m0fg'
 group by sql_id

查出sql如下:

UPDATE FSL_OR SET SEND = '1' WHERE ORDERNUMBER = 'A' || '-' || : B2 || '-' || :B1 AND ORTYPE='实际订单';

2、查看执行计划

这里很明显是FSL_OR SET表走了全表扫描。


3、获取sql相关信息

sqlplus / as sysdba @/home/oracle/sql/spoolsql.sql

相关信息:


4、目前索引情况

查看目前索引情况,截图如下:


5、考虑增加组合索引

--大表需加online这个参数,除了create过程中index保持online状态,Oracle还会在create index之前等待所有DML操作结束,然后得到DDL锁,开始create
create index IDX_FSL_OR_4 on fsl_or(ordernumber,ortype) tablespace rf_indx online;
--如果不commit,上面的操作就会一直hold
commit;

//分析索引

BEGIN
SYS.DBMS_STATS.GATHER_INDEX_STATS (OwnName => 'RFUSER',
 IndName => 'IDX_FSL_OR_4',
 Estimate_Percent => 10,
 Degree => SYS.DBMS_STATS.DEFAULT_DEGREE,
 No_Invalidate => FALSE);
END;

6、查看最新执行计划

添加索引后一定要再看下执行计划是否索引生效。

优化后结果:FSL_OR由全表扫描改成走索引范围扫描,cost由32793降为3。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表