目录
测试一:两表关联分页,关联键未加索引(当前两表数据量为120多万)
测试二:两表关联分页,关联键添加索引(当前两表数据量为120多万)
场景:
作为后端开发经常遇到线上优化问题,重要的一个优化方向就是SQL语句的索引优化,熟练掌握索引优化技巧十分重要。
查看执行计划
方式一:在PLSQL工具中选中目标sql直接执行F5
方式二:执行explain plan for命令
explain plan for select * from ( select a.*,rownum as num from (
select RES.* ,H.NAME_ as bizName,
from gisqbpm.ACT_HI_PROCINST RES
left join gisqbpm.ACT_HI_BIZ_PROCINST H on H.PROC_INST_ID_ = RES.PROC_INST_ID_ )a where rownum<15 )b where b.num>0;
再执行如下
select * from TABLE(DBMS_XPLAN.display);
认识执行计划器
Optimizer goal: 优化目标 ,其中优化目标有四种分别是 Choose、Rule、First Rows 和 All Rows。
-
Choose:当优化目标设置为 Choose 时,优化器会根据查询的复杂度和统计信息等因素自动选择合适的优化模式。这种设置通常会给优化器更大的自由度,让其根据实际情况选择最合适的执行计划。
-
Rule:当优化目标设置为 Rule 时,优化器会使用基于规则的优化模式来生成执行计划。这种模式通常用于兼容性考虑,以确保与旧版本 Oracle 数据库的兼容性。
-
First Rows:当优化目标设置为 First Rows 时,优化器会优先考虑生成能够快速返回少量行的执行计划,适用于需要快速返回结果的查询。
-
All Rows:当优化目标设置为 All Rows 时,优化器会优先考虑生成能够一次性返回所有结果行的执行计划,适用于需要返回全部结果集的查询。
这四种优化目标分别代表了优化器在生成执行计划时的不同偏好和策略,Choose 提供了自动选择的灵活性,Rule 用于兼容性考虑,而 First Rows 和 All Rows 分别关注查询返回结果的速度和完整性。其中当没有显式地指定优化目标时,Oracle 会使用 "All Rows" 作为默认的优化目标。
Description:描述sql的执行计划、Object owner:对象模式、Object name:对象名
Cost:花费(的时间)、Cardinality:基数
执行顺序
点击下一步操作可以完整地观察到sql的执行计划
具体执行如下
first operation
TABLE ACCESS FULL :全表扫描
故该步骤应该执行的是ACT_HI_PROCINST表的全表扫描
next operation
INDEX RANGE SCAN:与B-TREE索引相关的执行计划,返回多条rowid的索引扫描。
故该步骤执行的是ACT_HI_BIZ_PROCINST表中 在PROC_INST_ID_列上建的索引扫描计划
next operation
TABLE ACCESS BY INDEX ROWID:通过索引rowId访问表执行计划
故该步骤执行的是通过索引rowId去访问ACT_HI_BIZ_PROCINST表
next operation
NESTED LOOPS OUTER:执行了表连接相关的执行计划
故这里执行了和ACT_HI_BIZ_PROCINST的left join的连接
next operation
COUNT STOPKEY 用于计算满足查询条件的记录的数量。它使用一个停止键的机制,当计数达到指定的数量时就停止计算,不再扫描剩余的数据.
因此这一步应该对应的是分页 rownum<15
next operation
VIEW
last operation
SELECT STATEMENT, GOAL = ALL_ROWS 查询所有结果集了。
疑问:
1.两表关联分页,关联键加索引会提高查询性能?
测试一:两表关联分页,关联键未加索引(当前两表数据量为120多万)
执行5次分别是 7.313 8.688 8.281 6.859 9.959
执行计划
此时发现第一步执行的是ACT_HI_BIZ_PROCINST全表扫描,第二步执行的是ACT_HI_PROCINST全表扫描
测试二:两表关联分页,关联键添加索引(当前两表数据量为120多万)
首先给关联键添加索引
create index ACT_IDX_HI_BIT_PROC_INST on gisqbpm.ACT_HI_BIZ_PROCINST(PROC_INST_ID_);
注:PROC_INST_ID_另一个表ACT_HI_PROCINST中该字段的索引已经有,第一步测试只删了ACT_HI_BIZ_PROCINST表中该字段的索引
执行5次分别为 0.063 0.062 0.078 0.062 0.093
执行计划
结论:
两表关联分页查询关联键添加索引,会提高查询性能。