Oracle11g温习-第十三章:索引

2013年4月27日 星期六

10:46

 

1、索引(Index)的功能:对记录进行排序,加快表的查询速度

 2、索引的分类

 1)B-tree 索引(默认)

         a、在一个大表上

         b、建立在重复值比较少的列上 ,在做select查询时,返回记录的行数小于全部记录的4%

         c、如果这一列经常用来做where子句和排序,也可以用来建立索引

         d、一般用于OLTP                   

 2) bitmap index

         a、建立在重复值非常高的列上

         b、 在做DML 操作时,代价值比较高

         c、一般用于OLAP 或DSS

 —— B-tree 索引不能使用or连接的语句,bitmap index可以使用

3建立索引:默认建立  B-tree index

4建立索引表空间

SYS @ prod >create tablespace indexes datafile  '/u01/app/oracle/oradata/prod/index01.dbf' size 50m autoextend on next 10m maxsize 50m  extent management local uniform size 128k;

 

Tablespace created. 

 

SQL> select file_id,file_name,tablespace_name from dba_data_files;

 

     FILE_ID FILE_NAME                                          TABLESPACE_NAME

---------- -------------------------------------------------- ------------------------------

         1 /u01/app/oracle/oradata/prod/system01.dbf          SYSTEM

         2 /u01/app/oracle/oradata/prod/lx01.dbf              LX01

         3 /u01/app/oracle/oradata/prod/sysaux01.dbf          SYSAUX

         4 /u01/app/oracle/oradata/prod/users01.dbf           USERS

         7 /u01/app/oracle/oradata/prod/undotbs02.dbf         UNDOTBS2

        12 /u01/app/oracle/oradata/prod/index01.dbf           INDEXES 

 

SQL> create table test (id int,name varchar2(10),sex varchar2(4));                                                              

 

Table created.

 SQL> begin

      for i in 1..10000 loop

        insert into test values(i,'user||i,'M');

      end loop;

    end;

    /

 

SQL>   begin

     for i in 10001..20000 loop

        insert into test values(i,'user||i,'F');

      end loop;

   end;

SQL> select count(*) from test;

 

  COUNT(*)

----------

     20000

 

——建立b-tree 索引

 

SQL> create index test_sex_idx on test(sex) tablespace indexes;

 

Index created.

 

——分析索引结构

 

SQL> analyze index test_sex_idx validate structure;

 

Index analyzed.

 

SQL> select index_name,index_type,tablespace_name,blevel,leaf_blocks,num_rows

from user_indexes   where index_name='TEST_SEX_IDX';

 

 

INDEX_NAME      INDEX_TYPE  TABLESPACE_NAME  BLEVEL LEAF_BLOCKS NUM_ROWS

--------------- ----------- ---------------- ------ ----------- ----------

TEST_SEX_IDX    NORMAL       INDEXES           1          37      20000

 

                             

【——BLEVEL  索引的深度(高度 =深度+1)

     ——LEAF_BLOCKS,使用的索引块】

 

SQL> select index_name,table_name,column_name from user_ind_columns

   where index_name='TEST_SEX_IDX';

 

INDEX_NAME      TABLE_NAME      COLUMN_NAME

--------------- --------------- ---------------

TEST_SEX_IDX    TEST            SEX

 

SQL> select /*+ index (test TEST_SEX_IXD)*/ name,sex from test where sex='F';

 

10000 rows selected.

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 1357081020

 

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      | 10000 |    97K|    15   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| TEST | 10000 |    97K|    15   (0)| 00:00:01 |

--------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - filter("SEX"='F')

 

 

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size

          0  bytes sent via SQL*Net to client

          0  bytes received via SQL*Net from client

          0  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

      10000  rows processed

 

 

 

SQL> drop index test_sex_idx;

 

Index dropped.

——建立位图索引

 

SQL> create bitmap index test_sex_bitind on test(sex) tablespace indexes;

 

Index created.

 

——分析索引结构

SQL> analyze index test_sex_bitind validate structure;

 

Index analyzed.

 

SQL> select index_name,index_type,tablespace_name,blevel,leaf_blocks,num_rows from user_indexes    where index_name='TEST_SEX_BITIND';

 

INDEX_NAME      INDEX_TYPE      TABLESPACE_NAME   BLEVEL  LEAF_BLOCKS   NUM_ROWS

--------------- --------------- ---------------- ------- ----------- ----------

TEST_SEX_BITIND  BITMAP           INDEXES            0           1          2

 

——在重复值高的列上适合建立bitmap的索引 

 

SQL> select index_name,table_name,column_name from user_ind_columns

   where index_name='TEST_SEX_BITIND';

 

INDEX_NAME      TABLE_NAME      COLUMN_NAME

--------------- --------------- ---------------

TEST_SEX_BITIND TEST            SEX

 

 

SQL> select /*+ index (test TEST_SEX_BITIND)*/ name,sex from test where sex='F';

 

10000 rows selected.

 

Execution Plan

----------------------------------------------------------

Plan hash value: 2624764158

 

------------------------------------------------------------------------------------------------

| Id  | Operation                    | Name            | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |                 | 10000 |    97K|    85   (0)| 00:00:02 |

|   1 |  TABLE ACCESS BY INDEX ROWID | TEST            | 10000 |    97K|    85   (0)| 00:00:02 |

|   2 |   BITMAP CONVERSION TO ROWIDS|                 |       |       |            |          |

|*  3 |    BITMAP INDEX SINGLE VALUE | TEST_SEX_BITIND |       |       |            |          |

------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("SEX"='F')

 

 

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size

          0  bytes sent via SQL*Net to client

          0  bytes received via SQL*Net from client

          0  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

      10000  rows processed

 

 

SQL> drop index TEST_SEX_BITIND;                                                                                                                          

 

Index dropped.

 

 

5、基于函数的索引

 

SQL> conn scott/tiger

Connected.

 

SQL> set autotrace on;

 

SQL> create index emp_ename_ind on emp(ename) tablespace indexes;

 

Index created.

 

SQL> select * from emp where ename='SCOTT';

 

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------

      7788 SCOTT                          ANALYST                           7566 1987-04-19 00:00:00       3000                    20

 

Execution Plan

----------------------------------------------------------

Plan hash value: 3220259315

 

---------------------------------------------------------------------------------------------

| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |               |     1 |    87 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP           |     1 |    87 |     2   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP_ENAME_IND |     1 |       |     1   (0)| 00:00:01 |

---------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - access("ENAME"='SCOTT')

Note

-----

   - dynamic sampling used for this statement

 Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size

          0  bytes sent via SQL*Net to client

          0  bytes received via SQL*Net from client

          0  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

 

——通过函数访问,索引无效

SQL> select * from emp where lower(ename)='scott';

 

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------

      7788 SCOTT                          ANALYST                           7566 1987-04-19 00:00:00       3000                    20

Execution Plan

----------------------------------------------------------

Plan hash value: 3956160932

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     1 |    87 |    15   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| EMP  |     1 |    87 |    15   (0)| 00:00:01 |  ——索引无效

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter(LOWER("ENAME")='scott')

Note

-----

   - dynamic sampling used for this statement

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size

          0  bytes sent via SQL*Net to client

          0  bytes received via SQL*Net from client

          0  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

——建立函数索引

SQL> create index emp_ename_funind on emp(lower(ename)) tablespace indexes;

 

Index created.

SQL> select * from emp where lower(ename)='scott';

 

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------

      7788 SCOTT                          ANALYST                           7566 1987-04-19 00:00:00       3000                    20

 

Execution Plan

----------------------------------------------------------

Plan hash value: 519807088

 

------------------------------------------------------------------------------------------------

| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                  |     1 |    87 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP              |     1 |    87 |     2   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP_ENAME_FUNIND |     1 |       |     1   (0)| 00:00:01 |

------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access(LOWER("ENAME")='scott')

Note

-----

   - dynamic sampling used for this statement

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          0  consistent gets

          0  physical reads

          0  redo size

          0  bytes sent via SQL*Net to client

          0  bytes received via SQL*Net from client

          0  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          1  rows processed

6、索引监控

SQL> conn scott/tiger

Connected.

SQL> alter index emp_ename_funind monitoring usage;

Index altered.

SQL> select index_name,table_name,monitoring,used from v$object_usage;

 

INDEX_NAME                     TABLE_NAME      MONITORIN USED

------------------------------ --------------- --------- ---------

EMP_ENAME_FUNIND               EMP             YES       NO

 

SQL> select * from emp where LOWER(ename)='scott';                                                                             

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

 

SQL> select * from emp where lower(ename)='scott';

 

     EMPNO ENAME           JOB                    MGR HIREDATE                   SAL       COMM     DEPTNO

---------- --------------- --------------- ---------- ------------------- ---------- ---------- ----------

      7788 SCOTT           ANALYST               7566 1987-04-19 00:00:00       3000                    20

 

SQL> select index_name,table_name,monitoring,used from v$object_usage;

 

INDEX_NAME                     TABLE_NAME      MONITORIN USED

------------------------------ --------------- --------- ---------

EMP_ENAME_FUNIND               EMP             YES       YES

7、【反向索引----------用于建立索引的列值是连续的或通过序列生成时,避免索引存放到集中的leaf block,避免生成热块】。

1)建立反向索引

SQL> create index r_empno_ind on test(empno) reverse;

Index created.

——【对于emp表里empno列来说,因为客户ID号顺序递增,所以为了均衡索引数据分布,应在该列上建立反向索引。】

 

2)重建索引

SQL> alter index r_empno_ind rebuild reverse;

 

Index altered.

8、与索引有关的视图

DBA_INDEXES:

DBA_IND_COLUMNS:

V$OBJECT_USAGE:

 

posted @ 2017-09-15 14:37  Oracle-fans  阅读(356)  评论(0编辑  收藏  举报