zoukankan      html  css  js  c++  java
  • Oracle性能诊断艺术-学习笔记(索引访问方式)

    环境准备:

    1.0

    测试表

    CREATE TABLE t (

      id NUMBER,

      d1 DATE,

      n1 NUMBER,

      n2 NUMBER,

      n3 NUMBER,

      n4 NUMBER,

      n5 NUMBER,

      n6 NUMBER,

      c1 VARCHAR2(20),

      c2 VARCHAR2(20),

      pad VARCHAR2(4000),

      CONSTRAINT t_pk PRIMARY KEY (id)

    );

     

    2.0

    execute dbms_random.seed(0)

     

    3.0

    INSERT INTO t

    SELECT rownum AS id,

           trunc(to_date('2007-01-01','yyyy-mm-dd')+rownum/27.4) AS d1,

           nullif(1+mod(rownum,19),10) AS n1,

           nullif(1+mod(rownum,113),10) AS n2,

           nullif(1+mod(rownum,61),10) AS n3,

           nullif(1+mod(rownum,19),10) AS n4,

           nullif(1+mod(rownum,113),10) AS n5,

           nullif(1+mod(rownum,61),10) AS n6,

           dbms_random.string('p',20) AS c1,

           dbms_random.string('p',20) AS c2,

           dbms_random.string('p',255) AS pad

    FROM dual

    CONNECT BY level <= 10000

    ORDER BY dbms_random.value;

     

    4.0

    CREATE INDEX i_n1 ON t (n1);

    CREATE INDEX i_n2 ON t (n2);

    CREATE INDEX i_n3 ON t (n3);

    CREATE INDEX i_n123 ON t (n1, n2, n3);

    CREATE BITMAP INDEX i_bt_n4 ON t (n4);

    CREATE BITMAP INDEX i_bt_n5 ON t (n5);

    CREATE BITMAP INDEX i_bt_n6 ON t (n6);

    CREATE INDEX i_c1 ON t (c1);

    CREATE BITMAP INDEX i_bt_c2 ON t (c2);

     

    5.0

    BEGIN

      dbms_stats.gather_table_stats(

        ownname          => user,

        tabname          => 'T',

        estimate_percent => 100,

        method_opt       => 'for all columns size skewonly',

        cascade          => TRUE

      );

    END;

    /

     

    6.0 ALTER SESSION SET statistics_level = all;  --这是很关键的一步

    7.0 分情况对待

    7.1  字段id为主键,谓词条件中包含 id 且返回值是 1  故  对 id做 唯一索引扫描

    7.2 字段n1 有普通索引,谓词条件中包含 n1= 且返回值是多个, 故作索引范围扫描

    7.3 等于条件和B-树索引

    7.4 等于条件和位图索引

    按照执行的顺序:

                        第一个操作是 BITMAP INDEX SINGLE VALUE 应用限制条件扫描索引

                        第二个操作是 BITMAP CONVERSION TO ROWIDS,将第一个操作中获取的位图转换为一个rowid列表中

             第三个操作 根据 第二个操作返回的rowid列表访问表。

     

    注意以上操作只执行一次。

     7.5 IS NULL条件和B-树索引

    对于B-树索引来说,当使用多个sql条件并且其中至少一个事 不基于 IS NULL 或是 不基于 不等于条件时,才可以通过符合B-树索引来使用 IS NULL 条件。如下的查询对此进行了描述。

    执行计划通过操作2上的谓词确认列n2 上的条件使用了索引I-N123.也要注意到 操作2 只返回了5行,杜宇前面一节的例子,没有n2 is null ,返回了 527行。

     7.6 is null条件和位图索引

     位图索引可以存储 null值哦

    7.7 范围条件和B-树索引

    索引扫描默认是升序的。意味着 当 order by 和 范围条件都是用同一列的时候,结果已经排好序了。因而,不用进行显示的排序。不过 当需要降序进行 order by 的时候,需要显示的制指定 index_desc

    7.8 范围条件和位图索引

    用位图索引,范围条件和等于条件以相同方式处理。唯一的差别是使用了 BITMAP INDEX RANGE SCAN 操作而不是BITMAP INDEX SINGLE VALUE操作。

    7.9  IN 条件

    in条件没有特定的访问路径。相反,在执行计划中,inlist iterator操作指出因为in条件的原因部分执行计划被多次执行。如下三个查询演示了操作如何根据索引类型被用于索引扫描。

    第一个是唯一索引 

    第二个是非唯一索引

    第三个是位图索引

    1. Min/max函数和B-树索引   Index full scan(min/max)j仅仅得到最右边和最左边的索引键 

     

  • 相关阅读:
    [RxSwift]3.3、数据绑定(订阅)
    [RxSwift]3.2、函数式编程 -> 函数响应式编程
    [RxSwift]2、Hello RxSwift!:我的第一个 RxSwift 应用程序
    [RxSwift]1、为什么要使用 RxSwift ?
    [RxSwift]RxSwift: ReactiveX for Swift
    [Swift]UIViewController
    104. 二叉树的最大深度
    103. 二叉树的锯齿形层次遍历
    102. 二叉树的层序遍历
    98. 验证二叉搜索树
  • 原文地址:https://www.cnblogs.com/iyoume2008/p/7041313.html
Copyright © 2011-2022 走看看