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仅仅得到最右边和最左边的索引键 

     

  • 相关阅读:
    Codeforces 1316B String Modification
    Codeforces 1305C Kuroni and Impossible Calculation
    Codeforces 1305B Kuroni and Simple Strings
    Codeforces 1321D Navigation System
    Codeforces 1321C Remove Adjacent
    Codeforces 1321B Journey Planning
    Operating systems Chapter 6
    Operating systems Chapter 5
    Abandoned country HDU
    Computer HDU
  • 原文地址:https://www.cnblogs.com/iyoume2008/p/7041313.html
Copyright © 2011-2022 走看看