Oracle执行计划总结

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获取数据。
    这里写图片描述
    索引扫描包括:
    • index unique scan;索引唯一扫描,用于unique约束和主键的索引
    • index range scan:索引范围扫描,用于非唯一索引的扫描;唯一索引上执行范围操作;组合索引使用部分列(包括前导列)
    • index skip scan:索引跳扫。在CBO优化器的情况下,对于组合索引(a,b),如果a的区分度很小如a=x,y,当查询条件只有b时,会执行(x,b)+(y,b)
    • index full scan: 在CBO的情况下,查询出的数据可以全部从索引得到
    • index fast scan: 索引快速扫描和index full scan类似,只是不需要排序

表连接方式

涉及的表:

  • 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中看能不能找到匹配的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值