Oracle优化器
- RBO rule based optimization:基于规则的优化器,对数据不敏感
- CBO cost based optimization 基于代价的优化器,会计算执行代价,选出最优化的策略
执行计划
Table Access By
- Table access full 全表扫描
- Table access by rowid ; rowId是oracle给每一行数据加在后面的伪列,唯一确定一个记录所在的数据文件,块,行在块中的位置,不管数据怎么变rowid不变,是获取一条数据最快的方式
- Table access by index scan:扫描索引,得到rowid,通过rowid获取数据。
索引扫描包括:
表连接方式
涉及的表:
- Driving table 驱动表/外层表:用于nested loop和hash join中,如果驱动表返回的数据量较多会增大执行代价,一般选取where条件过滤后数据量小的表作为驱动表。
- Probed table匹配表/内层表,从驱动表获取一行数据后会从这个表里寻找符合条件的列,一般为大表。
连接方式:
- sort merge join排序-合并连接:
select a.name,b.name from table_A a join table_B b on (a.id = b.id),首先根据a.id查出符合条件的A表数据并排序,然后根据b.id查出B表数据并排序,最后合并两边排序后的数据。适合的连接条件< <= = > >= ,不适用的连接条件有: <> like - Nested loops嵌套循环
首先取出source1表(驱动表)符合条件的第一行,遍历source2表,取出符合条件的匹配行放入结果集;再取source1中的第二行,遍历source2.。。。如果source1有N行则会遍历N次source2. 限制where条件使得驱动表的数据尽量少,关联条件应该选匹配表的唯一索引或者区分度高的索引。 - Hash Join哈希连接 只适用于=连接条件。对驱动表的数据集,根据连接关联列做hash为key,构建hashtable,关联表根据关联列计算用相同的hash函数计算hash,在hashtable中看能不能找到匹配的数据。