加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle执行计划总结

发布时间:2020-12-12 14:05:39 所属栏目:百科 来源:网络整理
导读:Oracle优化器 RBO rule based optimization:基于规则的优化器,对数据不敏感 CBO cost based optimization 基于代价的优化器,会计算执行代价,选出最优化的策略 执行计划 Table Access By Table access full 全表扫描 Table access by rowid ; rowId是orac

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中看能不能找到匹配的数据。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读