1、索引的创建
CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> --默认为Btree索引 ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC, --expression基于函数的索引 <column_name> | <expression> ASC | DESC,...) --组合索引 TABLESPACE <tablespace_name> --索引存储的表空间 STORAGE <storage_settings> --设置表空间存储参数 LOGGING | NOLOGGING --指定是否产生重做日志 COMPUTE STATISTICS --创建时收集统计信息 NOCOMPRESS | COMPRESS<nn> --键压缩,删掉键中重复的值 NOSORT | REVERSE --索引顺序与表相同,相反 PARTITION | GLOBAL PARTITION<partition_setting> --索引分区2、索引特性
索引的好处 加快数据的检索速度,加速表和表之间的连接,减少查询中分组和排序的时间,提高系统的性能。 索引的不足 创建索引和维护索引要耗费时间,需要占物理空间,对表中数据的DML操作,索引也需要动态维护,降低数据维护速度。 应该建索引的列 经常需要搜索的列 经常用在连接的列 经常需要排序的列 经常使用在WHERE 子句中的列 组合索引列中把最频繁访问的列放最前 当修改性能远大于检索性能时,不要创建索引 e.组合索引时尽量将过滤大范围的放在后面,因为SQL执行是从后往前的, 限制索引,使一些索引无法使用 使用不等于操作符(<> 、 != ),通过把不等于操作符改成 OR 条件,在RBO下会使用索引,CBO下仍不会使用索引。 使用 IS NULL 或 IS NOT NULL ,要建索引的列尽量不要有空值; 使用函数,对索引列用函数会限制索引,可以将函数用在列的取值上; 比较不匹配的数据类型,比较时会将列转成与值相同的数据类型再比较,可以转换值得数据类型; 索引的选择性(USER_INDEXES.distinct_keys/count(*)),判断索引返回数据的多少; 群集因子(USER_INDEXES.Clustering_Factor,与leaf_blocks,num_rows)进行比较,判断索引列的有序性 二元高度(Binary height),user_INDEXES.Blevel列,二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程 度而变化,对索引列的删除修改会增加二元高度,重建索引可能会降低二元高度。 快速全局扫描,(Fast Full Scan) 允许 Oracle 执行一个全局索引扫描操作。快速全局扫描读取 B- 树索引上所有树叶块。 跳跃式扫描:允许优化器使用组合索引,即索引的前导列没有出现在 WHERE 子句中。比全索引扫描要快的多。可以对组合 索引的部分列使用。3、索引管理
重建索引 alter index index_name rebuild tablespace index02; alter index index_name rebuild online; 对于分区索引,不能整体进行重建,只能对单个分区进行重建。语法如下: Alter index idx_name rebuild partition index_partition_name [online nologging] 删除索引,删除的数据在索引里只是标记为删除,只有删除的数据大于块里存的总记录,这时一个块被清空,索引 重建全局索引命令如下: Alter index idx_name rebuild [online nologging] 总的数据条数才会减少。 drop index index_name; 整理索引碎片 alter index index_name coalesce; 分析索引 analyze index index_name validate structure; select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;4、索引查询视图
DBA_INDEXES USER_INDEXES USER_IND_COLUMNS 5、ORACLE ROWID ROWID 其实就是直接指向单独行的线路图,提供了访问单行数据的能力。6/3/6/3:对象/文件/块/行 查询表里行的rowid,块号 select rowid,dbms_rowid.rowid_block_number(rowid), iid from tb; 工具函数,查询行所在的文件号,块号,行号 --工具函数 create or replace function get_rowid (l_rowid in varchar2) return varchar2 is ls_my_rowid varchar2(200); rowid_type number; object_number number; relative_fno number; block_number number; row_number number; begin dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number); ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)|| 'Relative_fno is :'||to_char(relative_fno)||chr(10)|| 'Block number is :'||to_char(block_number)||chr(10)|| 'Row number is :'||to_char(row_number); return ls_my_rowid ; end; select get_rowid('AAASheAAEAAAAIOAAB') from dual; 6、索引的分类 B树索引 通用索引、默认的索引类型,最多可以包括 32 列。索引列的值都存储在索引中。当索引列的值满足 查询时就不用从表中查询;B 树索引的索引值中包含 ROWID ,这样 Oracle 就可以在行级别上锁定索引。 Oracle不会对索引列上包含 NULL 值的行进行索引。树叶块包含了索引值、ROWID,以及指向前一个和后 一个树叶块的指针。 特点: 适合与大量的增、删、改(OLTP ) 不能用包含OR 操作符的查询,CBO优化器OR操作不走索引 适合高基数的列(唯一值多) 位图索引 非常适合于决策支持系统(Decision Support System , DSS) 和数据仓库,位图索引存储为压缩的索 引值,其中包含了一定范围的 ROWID ,因此 Oracle 必须针对一个给定值锁定所有范围内的 ROWID 。这 种锁定类型可能在某些 DML 语句中造成死锁。列中包含了非常多的重复值,很少UPDATE操作,最多30列 特点: 适合与决策支持系统; 做UPDATE 代价非常高; 非常适合OR 操作符的查询; 基数比较少的时候才能建位图索引; HASH索引 使用HASH索引必须要使用HASH集群。 索引组织表 把表的存储结构改成B树结构,以表的主键进行排序。 反转键索引 磁盘容量有限,同时还要执行大量的有序载入,就可以使用反转键索引 基于函数的索引 create index EMP$UPPER_JOB on emp(UPPER(job)); 分区索引 就是简单地把一个索引分成多个片断。可以访问更小的片断( 也更快 ) ,B树和位图索引都可以被 分区,而HASH索引不可以被分区。表被分区而索引未被分区;表未被分区而索引被分区;表和索引都被 分区。分区能够提供更多可以提高性能和可维护性的可能性,用分区后的表和索引时,Oracle还支持并 行查询和并行DML。 本地分区索引 使用与表相同的分区键和范围界限来对本地索引分区。本地索引可以是B树或位图索引,当表的分 区发生变化时,索引的维护由Oracle自动进行。局部索引只支持分区内的唯一性,无法支持表上的唯一 性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。 create index ix_custaddr_local_id on custaddr(id) local; 有前缀索引:指包含了分区键,并且将其作为引导列的索引。 无前缀索引:索引的列不是以分区键开头,或者不包含分区键列。 全局分区索引 可以选择是否分区,而且索引的分区可以不与表分区相对应。全局分区索引只能是B树索引,到目 前为止(10gR2),oracle只支持有前缀的全局索引。oracle不会自动的维护全局分区索引,当我们在对 表的分区做修改时可以加上update global indexes,或者执行完操作后 REBUILD。oracle只支持 range partitioned 和 Hash Partitioned.2中类型的全局分区索引 全局索引,全局索引对所有分区类型都支持:全局分区索引,只支持Range 分区和Hash 分区: 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和 索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。 参考资料: http://www.2cto.com/database/201110/107271.html http://www.cnblogs.com/flowerszhong/p/4535206.html什么是聚集索引,什么是非聚集索引,什么又是主键?
聚集索引确定表中数据的物理顺序。聚集索引规定数据在表中的物理存储顺序,一个表只能包含一个聚集 索引,但该索引可以包含多个列。聚集索引对于搜索范围值的列特别有效。从表中检索的数据进行排序时可以 将该表在该列上创建聚集索引,提高性能。 非聚集索引是,索引与数据物理存储分开,索引带有指针指向数据的存储位置。索引和表按自己的值排序 多用于包含大量非重复值的列,返回精确匹配的查询。 PRIMARY KEY 约束表中一个列或列的组合,其值能唯一地标识表中的每一行。通过它可强制表的实体完整性。 http://blog.sina.com.cn/s/blog_7e662b4a01012cx6.html