oracle 第18章 索引

2015-10-23

目录

1.创建索引 CREATE INDEX

2.修改索引 ALTER INDEX

3.删除索引 DROP INDEX

 

1.创建索引 CREATE INDEX

【语法】CREATE INDEX 官方文档

create_index::=

CREATE [ UNIQUE | BITMAP ] INDEX [ schema. ] index
  ON { cluster_index_clause
     | table_index_clause
     | bitmap_join_index_clause
     }
[ USABLE | UNUSABLE ] ;
View Code

cluster_index_clause ::=

CLUSTER [ schema. ] cluster index_attributes
View Code

table_index_clause ::=

[ schema. ] table [ t_alias ]
(index_expr [ ASC | DESC ]
  [, index_expr [ ASC | DESC ] ]...)
  [ index_properties ]
View Code

bitmap_join_index_clause ::=

[ schema.]table
   ( [ [ schema. ]table. | t_alias. ]column
     [ ASC | DESC  ]
       [, [ [ schema. ]table. | t_alias. ]column
          [ ASC | DESC ]
       ]...
   )
   FROM [ schema. ]table [ t_alias ]
          [, [ schema. ]table [ t_alias ]
        ]...
   WHERE condition
      [ local_partitioned_index ] index_attributes
View Code

2.修改索引 ALTER INDEX

【语法】 ALTER INDEX 官方文档

 

3.删除索引 DROP INDEX

【语法】 DROP INDEX 官方文档

 

【例子】

索引是oracle的一个对象,是否使用索引由oracle的CBO优化器决定。

一、数据访问方式
1.全表扫描(full table scan)
如果读取表的数据总量超过5%~10%,通常会进行全表扫描,全表扫描采取多块读。
SQL> explain plan for select * from dual;
SQL> select * from table(dbms_xplan.display);

2.行id扫描(rowid)
在向表中插入数据时,隐含会创建改行的rowid,rowid是数据行所存储的数据块地址。rowid查找数据采取单块读。
SQL> expalin plan for select * from dept where rowid = 'AAAAyGAADAAAA..';
SQL> select * from table(dbms_xplan.display);

3.索引扫描(index rowid)
索引扫描是通过索引找到数据行的rowid,然后通过rowid直接到表中查找数据。因为一个rowid对应一个数据行,所以这种方式也会采取单块读。
SQL> expalin plan for select * from emp;
SQL> select * from table(dbms_xplan.display);

二、索引扫描类型
1.索引唯一扫描(index unique scan)
索引唯一扫描是通过唯一键、主键,返回一个数据行。
SQL> explain plan for select * from emp where empno=10;
SQL> select * from table(dbms_xplan.dispaly);

2.索引范围扫描(index range scan)
在唯一键上使用range操作符(><<>>=<=between),在组合索引上只使用部分列查询出多行;对非唯一索引列查询。
SQL> explain plan for select * from emp where empno>18;
SQL> select * from table(dbms_xplan.display);

3.索引全扫描(index full scan)
查询出的数据全部从索引得到。
SQL> explain plan for select empno,ename from emp;
SQL> select * from table(dbms_xplan.display);

4.索引快速扫描(index fast full scan)
扫描所有数据块,不进行数据排序,可以多块读、并行读。
SQL> explain paln for select empno,ename from big.emp;

三、索引限制条件
1.不等运算
SQL> explain plan for select * from emp where empno<>10;
SQL> select * from table(dbms_xplan.display);

2.NULL或IS NOT NULL
SQL> select column_name from user_ind_columns where table_name='EMP';
SQL> create index idx_sal_emp on emp(sal);
SQL> select column_name from user_ind_columns where table_name='EMP';
SQL> explain plan for select empno,ename,deptno from emp where sal is null;
SQL> select * from table(dbms_xplan.display);

3.函数trunc、substr、to_date、to_char、instr等
SQL> explain plan for select empno,ename,deptno from emp where trunc(hiredate)='03-12月-81';
SQL> select * from table(dbms_xplan.display);

#修改SQL防止函数对索引的影响
SQL> explain plan for select empno,enmae,deptno from emp where hiredate>'03-12月-81' and hiredate < to_date('03-12月-81')+0.999999);

3.比较不匹配数据类型
SQL> explain plan for select bank_name,address,city,state,zip from banks where zip=100043;
SQL> select * from table(dbms_xplan.display);

选择性:选择性高指不同的值越多,使用索引返回的数据量越少。
集群因子:集群因子是通过一个索引扫描一张表,需要访问表的数据块数量。

#查询索引的二元高度
SQL> select blevel,index_name from user_indexes where index_name='EMP_DEPARTMENT_IX';

#收集表employees包含直方图的统计信息
SQL> exec dbms_stats.gather_table_stats('HR','EMPLOYEES',METHOD_OPT=>'FOR COLUMNS SIZE 10 job_id');

#对emp表建立索引
SQL> conn scott/oracle;
SQL> create index emp_ename_idx on emp(ename);
#查询索引信息
SQL> col index_name for a20;
SQL> col index_type for a10;
SQL> col table_name for a20;
SQL> col tablespace_name for a20;
SQL> select index_name,index_type,table_name,tablespace_name from user_indexes;
#查询索引对应的表空间信息
SQL> select a.index_name,a.tablespace_name,b.file_name from dba_indexes a,dba_data_files b where a.index_name like 'EMP%' and a.tablespace_name = b.tablespace_name;

#创建索引表空间
SQL> conn system/oracle;
SQL> create tablespace index_tbs datafile '/u01/app/oracle/oradata/orcl/index_tbs1.dbf' size 100M autoextend on;
#创建表多列索引
SQL> create index emp_ename_sal_idx on emp(ename,sal) tablespace index_tbs;
#查看多列索引emp_ename_sal_idx信息
SQL> col index_name for a20;
SQL> run select index_name,table_name,tablespace_name from user_indexes where index_name like 'EMP%';

#查询索引列信息
SQL> col column_name for a40;
SQL> select index_name,table_name,column_name from user_ind_columns where index_name like 'EMP%';
#查询索引信息
SQL> col dropped for a10;
SQL> rum select index_name,table_name,table_owner,dropped,tablespace_name from user_indexes;

#创建位图索引,适合数据仓库
SQL> create bitmap index emp_job_bitmap_idx on emp(job);
#查看位图索引
SQL> col index_name for a20;
SQL> col index_type for a20;
SQL> col table_name for a10;
SQL> select index_name,index_type,table_name,status from user_indexes where index_name like 'EMP%';

#创建cluster表,hash索引适合数据仓库
SQL> create cluster credit_cluster(card_no varchar2(16),transdate date sort) hashkeys 10000 hash is ora_hash(card_no) size 2186;
SQL> create table credit_orders(card_no varchar2(16),transdate date,amount number) cluster credit_cluster(card_no,transdate);

#创建反向键索引
SQL> create index emp_sal_reverse_idx on emp(sal) reverse;
#查看反向键索引
SQL> select index_name,index_type,table_name from user_indexes where index_name like 'EMP%';

#创建基于upper函数的函数索引
SQL> create index dept_dname_idx on dept(upper(dname));
SQL> select upper(dname) from dept where upper(dname) = 'NEW YORK';
#通过user_indexes查看函数索引信息
SQL> col index_type for a30;
SQL> select idnex_name,index_type,table_name from user_indexes where index_name like 'DEPT%';
#通过user_idx_columns查看函数索引信息
SQL> select index_name,table_name,column_name from user_ind_columns;


#监控索引emp_ename_bitmapt_idx
SQL> alter index emp_ename_bitmap_idx monitoring usage;
SQL> select empno,ename,sal from emp where ename like 'S%';
SQL> alter index emp_ename_bitmap_idx nomonitoring usage;
SQL> select index_name,table_name,monitoring,used from v$object_usage;
SQL> select index_name,start_monitoring,end_monitoring from v$object_usage where index_name = 'EMP_ENAME_BITMAP_IDX';

#重建索引
SQL> alter index emp_ename_bitmap_idx rebuild;
#重建索引并迁移表空间
SQL> alter index dept_dname_idx rebuild tablespace index_tbs1;
SQL> select index_name,table_name,tablespace_name,status from user_indexes;
#重建索引并修改存储参数
SQL> alter index emp_ename_bitmap_idx rebuild pctfree 30 storage (next 100k);
#联机重建索引
SQL> alter index dept_dname_idx rebuild online;

#查询当前索引参数设置
SQL> col index_name for a20;
SQL> select index_name,pct_free,pct_increase,initial_extent,next_extent from user_indexes;
#通过rebuild修改索引参数
SQL> alter index emp_job_bitmap_idx rebuild pctfree 30 storage (next 100k);
#查看修改后索引参数
SQL> select index_name,pct_free,pct_increase,initial_extent,next_extent from user_indexes where index_name = 'emp_job_bitmap_idx';
#增加索引磁盘空间
SQL> alter index emp_job_bitmap_idx allocate extent;
#查询索引区段信息
SQL> select segment_name,segment_type,tablespace_name,extents from user_segment where segment_type = 'INDEX' and segment_name like 'EMP%';
#合并索引碎片
SQL> alter index emp_job_bitmap_idx coalesce;

#删除索引
SQL> drop index dept_dname_idx;

 

 

参考资料

[1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013

[2] Oracle中的索引详解

[3] oracle索引,索引的建立、修改、删除

[4] ORACLE索引介绍和使用

[5] Oracle 索引 详解

[6] oracle 索引

[7] Oracle 索引的分类,分析与比较....(转载)

[8] Oracle索引 详解

[9] Oracle 索引基本原理

[10] 浅谈Oracle索引

[11] oracle-索引原理

[12] oracle 的索引

[13] Oracle索引整理的详细描述

[14] oracle索引类型

[15] Oracle索引类型-参考

[16] Oracle 索引的分类

[17] [Oracle]深入研究B-树索引

[18] B树索引学习总结

[19] B树索引和位图索引

[20] Oracle B树索引概念的理解

[21] Oracle B树索引分析(B-Tree Index)

[22] 深入研究B树索引(一)

[23] ORACLE中的位图索引详解

[24] oracle位图索引

[25] Oracle 索引(位图索引)

[26] Oracle - 怎样使用B树索引和位图索引

[27] Oracle索引(B*tree与Bitmap)的学习总结

[28] Oracle基本索引的使用

[29] oracle 反向键索引的原理和用途(减少索引热点块)!

[30] Oracle中的反向索引

[31] oracle函数索引小结

[32] 深入探讨Oracle函数索引

[33] Oracle 实现基于函数的索引

[34] Oracle监控索引使用

[35] Oracle索引监控(monitor index)

[36] Oracle 索引监控与外键索引

[37] ORACLE重建索引详解

[38] oracle 重建索引方法 分析

[39] oracle重建索引

[40] Oracle 表的移动和索引的重建

[41] Oracle表与索引的分析及索引重建

[42] Oracle性能分析9:重建索引

[43] Oracle维护索引

[44] ORACLE索引的日常维护

[45] Oracle 索引的维护

[46] Oracle的分区表和Local索引创建与维护

[47] 从实例看oracle的索引监控与无效索引维护

 

posted @ 2015-10-23 18:27  岑亮  阅读(360)  评论(0编辑  收藏  举报