一、索引的建立
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> --索引分区html
二、索引特性
索引的好处
加快数据的检索速度,加速表和表之间的链接,减小查询中分组和排序的时间,提升系统的性能。
索引的不足
建立索引和维护索引要耗费时间,须要占物理空间,对表中数据的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 子句中。比全索引扫描要快的多。能够对组合
索引的部分列使用。express
三、索引管理
重建索引
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;oracle
四、索引查询视图
DBA_INDEXES
USER_INDEXES
USER_IND_COLUMNS
五、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;
六、索引的分类
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 工具