• 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 中的位置,在该位置上检查能否找到匹配的数据

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/kawashibara/p/9954341.html
Copyright © 2020-2023  润新知