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

 

 

posted @ 2017-06-17 20:54  Oracle-fans  阅读(226)  评论(0编辑  收藏  举报