zoukankan      html  css  js  c++  java
  • oracle执行计划相关

    执行计划相关

    根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)

    同一级如果某个动作没有子ID就最先执行

    同一级的动作执行时遵循最上最右先执行的原则

    TABLE ACCESS BY … 即描述的是该动作执行时表访问(或者说Oracle访问数据)的方式;

    表访问的几种方式:(非全部)

    TABLE ACCESS FULL(全表扫描)

    TABLE ACCESS BY ROWID(通过ROWID的表存取)

    TABLE ACCESS BY INDEX SCAN(索引扫描)

    索引扫描又分五种:

    INDEX UNIQUE SCAN(索引唯一扫描)

    INDEX RANGE SCAN(索引范围扫描)

    INDEX FULL SCAN(索引全扫描)

    INDEX FAST FULL SCAN(索引快速扫描)

    INDEX SKIP SCAN(索引跳跃扫描)

    INDEX UNIQUE SCAN(索引唯一扫描):

    针对唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;

    表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle常实现唯一性扫描;

    INDEX RANGE SCAN(索引范围扫描):

    使用一个索引存取多行数据;

    发生索引范围扫描的三种情况:

    在唯一索引列上使用了范围操作符(如:> < <> >= <= between)

    在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)

    对非唯一索引列上进行的任何查询

    c) INDEX FULL SCAN(索引全扫描):

    进行全索引扫描时,查询出的数据都必须从索引中可以直接得到(注意全索引扫描只有在CBO模式下才有效)

    d) INDEX FAST FULL SCAN(索引快速扫描):

    扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它不对查询出的数据进行排序(即数据不是以排序顺序被返回)

    e) INDEX SKIP SCAN(索引跳跃扫描):

    Oracle 9i后提供,有时候复合索引的前导列(索引包含的第一列)没有在查询语句中出现,oralce也会使用该复合索引,这时候就使用的INDEX SKIP SCAN;

    CBO:

    CBO是一种比RBO更加合理、可靠的优化器,在ORACLE 10g中完全取代RBO;

    CBO通过计算各种可能的执行计划的“代价”,即COST,从中选用COST最低的执行方案作为实际运行方案;

    它依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择,也就是对数据“敏感”。

    NESTED LOOPS … 描述的是表连接方式;

    JOIN 关键字用于将两张表作连接,一次只能连接两张表,JOIN 操作的各步骤一般是串行的(在读取做连接的两张表的数据时可以并行读取);

    表(row source)之间的连接顺序对于查询效率有很大的影响,对首先存取的表(驱动表)先应用某些限制条件(Where过滤条件)以得到一个较小的row source,可以使得连接效率提高。

    驱动表(Driving Table):

    表连接时首先存取的表,又称外层表(Outer Table),这个概念用于 NESTED LOOPS(嵌套循环) 与 HASH JOIN(哈希连接)中;

    如果驱动表返回较多的行数据,则对所有的后续操作有负面影响,故一般选择小表(应用Where限制条件后返回较少行数的表)作为驱动表。

    匹配表(Probed Table):

    又称为内层表(Inner Table),从驱动表获取一行具体数据后,会到该表中寻找符合连接条件的行。故该表一般为大表(应用Where限制条件后返回较多行数的表)。

    表连接的几种方式:

    SORT MERGE JOIN(排序-合并连接)

    NESTED LOOPS(嵌套循环)

    HASH JOIN(哈希连接)

    CARTESIAN PRODUCT(笛卡尔积)

    SORT MERGE JOIN(排序-合并连接):

    假设有查询:select a.name, b.name from table_A a join table_B b on (a.id = b.id)

    内部连接过程:

    a) 生成 row source 1 需要的数据,按照连接操作关联列(如示例中的a.id)对这些数据进行排序

    b) 生成 row source 2 需要的数据,按照与 a) 中对应的连接操作关联列(b.id)对数据进行排序

    c) 两边已排序的行放在一起执行合并操作(对两边的数据集进行扫描并判断是否连接)

    NESTED LOOPS(嵌套循环):

    内部连接过程:

    a) 取出 row source 1 的 row 1(第一行数据),遍历 row source 2 的所有行并检查是否有匹配的,取出匹配的行放入结果集中

    b) 取出 row source 1 的 row 2(第二行数据),遍历 row source 2 的所有行并检查是否有匹配的,取出匹配的行放入结果集中

    c) ……

    若 row source 1 (即驱动表)中返回了 N 行数据,则 row source 2 也相应的会被全表遍历 N 次。

    因为 row source 1 的每一行都会去匹配 row source 2 的所有行,所以当 row source 1 返回的行数尽可能少并且能高效访问 row source 2(如建立适当的索引)时,效率较高。

    应尽可能使用限制条件(Where过滤条件)使驱动表(row source 1)返回的行数尽可能少,同时在匹配表(row source 2)的连接操作关联列上建立唯一索引(UNIQUE INDEX)或是选择性较好的非唯一索引,此时嵌套循环连接的执行效率会变得很高。若驱动表返回的行数较多,即使匹配表连接操作关联列上存在索引,连接效率也不会很高。

    HASH JOIN(哈希连接) :

    哈希连接只适用于等值连接(即连接条件为 = )

    HASH JOIN对两个表做连接时并不一定是都进行全表扫描,其并不限制表访问方式;

    内部连接过程简述:

    a) 取出 row source 1(驱动表,在HASH JOIN中又称为Build Table) 的数据集,然后将其构建成内存中的一个 Hash Table(Hash函数的Hash KEY就是连接操作关联列),创建Hash位图(bitmap)

    b) 取出 row source 2(匹配表)的数据集,对其中的每一条数据的连接操作关联列使用相同的Hash函数并找到对应的 a) 里的数据在 Hash Table 中的位置,在该位置上检查能否找到匹配的数据

  • 相关阅读:
    网络流24题-[CTSC1999]家园
    网络流24题-孤岛营救问题
    汽车加油行驶问题(分层图最短路)
    送外卖(可重复点的哈密顿路径)
    信与信封问题
    最小完全图(最小生成树加边成完全图)
    校园网(有向图加边变成强连通图)
    玩具装箱
    MSTest、NUnit、xUnit对照表
    .NET Core学习 笔记索引
  • 原文地址:https://www.cnblogs.com/kawashibara/p/9954341.html
Copyright © 2011-2022 走看看