优化器的模式
优化器的模式是由optimizer_mode来决定的,optimizer_mode可能的值有RULE,CHOOSE,FIRST_ROWS_n(n=1,10,10,1000),
FIRST_ROWS,ALL_ROWS
结果集
结果集(Row Source)是指包含指定执行结果的集合。
一个执行步骤输出的结果集可能就是下一个执行步骤输入的结果集。
访问数据的方法
访问数据的两种方法,一是直接访问表,二是先访问索引,再回表。
访问表的方法
一是全表扫描,二是ROWID扫描
全表扫描的最大问题在于全表扫描的目标SQL的执行时间会不稳定,不可控,这个执行时间会随着目标的数量的递增而递增。
ROWID表示的是Oracle中数据行记录所在的物理存储地址。
ROWID扫描有两层含义,一是通过SQL语句输入的ROWID的值去访问数据表对应的数据行记录,二是先访问相关索引,然后根据索引得到的ROWID再回表访问对应的数据行记录。
访问索引的方法
索引包含两种数据块:一是索引分支块,二是索引叶子块。
索引唯一性扫描
索引唯一性扫描(INDEX UNIQUE SCAN)是针对唯一性索引(UNIQUE INDEX)扫描,它仅仅适用于where条件里是等值查询的目标SQL。
索引范围扫描
索引范围扫描(INDEX RANGE SCAN)适用于所有类型的B树索引。
索引的范围扫描可能会返回多行记录,其实这就是索引范围扫描中‘范围’二字的本质含义。
索引全扫描(INDEX FUALL SCAN)
索引快速全扫描(INDEX FAST FULL SCAN)
索引快速全扫描与索引全扫描的三点区别:
(1)索引快速全扫描只适用CBO
(2)索引快速全扫描可以使用多块读,也可以并行执行。
(3)索引快速全扫描执行的结果不一定是有序的。
表连接
以下三件事情影响执行计划:
1.表连接顺序
表连接顺序包含两层含义:一层含义是当两个表做连接时,优化器决定两表中谁做驱动表(outer table),谁做被驱动表(inner t able);另外一层含义是,当多表(超过两个表以上)做表连接时,优化器需要决定这些表中谁和谁先做连接,然后得出的结果 集再和剩余表中的哪一个表做连接,直到所有的表连接完毕。
2.表连接方法
两个表的连接方法有四种:排序合并连接,嵌套循环连接,哈希连接和笛卡儿连接。
3.访问单表的方法
表连接的类型
内链接
外连接
外连接(outer join)是对内连接的一种扩展,它是表连接的结果除了包含那些满足连接条件的记录之外,还包含驱动表那些不满足连接条件的记录。
表连接的方法
1)排序合并连接(Sort Merge Join)
2)嵌套循环连接(Nested Loops Join)
嵌套循环连接是一种两个表做表连接时依靠两层嵌套循环(分别为外循环和内循环)来得到连接结果集的表连接方法。
3)Hash Join
Hash Join连接是一种两个表做连接时只要依靠哈斯运算来得到连接结果集的表连接方法。
4)笛卡尔连接
5)反连接
6)半连接
7)星型连接