概述
最近比较有空,所以看了一些问题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方面的内容,感兴趣的朋友可以关注一下~
本文暂时没有评论,来添加一个吧(●'◡'●)