【Oracle数据库索引】

在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等。
各种索引的创建方法
(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
 Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位图索引。
Create BITMAP index indexname on tablename(columnname[columnname...
(5)函数索引。
Create index indexname on tablename(functionname(columnname))
注意:创建索引后要分析索引才能起作用。
 analyze index indexname compute statistics;
重建索引:alter index index_name rebuild [tablespace tbs_name];

CREATE INDEX QGTG.tesat ON QGTG.BJ_CB_T_CBHCZB(ZWCBM) LOGGING  NOPARALLEL;

create index 索引名字 on  表名字(字段) online

索引特点
1)索引的高度低
2)索引存储列值即索引存储了索引列值以及rowID
3)索引本身是有序的

全表扫描的优势一次可以读取多个块,这样IO次数可以大大降下来

聚合因子(clustering_factor)决定了回表查询的速度

聚合因子:有多少邻近的索引条目指向不同的数据块,一般指的块越少,聚合因子低,扫描块也少

select index_name,blevel,leaf_blocks,num_rows,distinct_keys,clustering_factor from user_ind_statistics
where table_name like 'T%' order by num_rows
降低聚合因子:重组表记录

利用索引的本身有序性,降低排序

索引执行计划
1)INDEX FULL SCAN
2)INDEX RANGE SCAN
3)INDEX FAST FULL SCAN 例如(count)查询,FAST比INDEX FULL SCAN更快的原因是一次读取多个索引块。
4) INDEX FULL SCAN(MIN/MAX)
技术不淘汰就有它的天空,一次读取多个块不容易保证排序,一次读取一个快可以保证有序,因此在有排序的场合,INDEX FULL SCAN的顺序读可以让排序消除,INDEX FAST FULL SCAN 虽然减少了逻辑读,但是排序这个动作却无法消除。所以count(*)和SUM之类的统计根本无需使用排序,一般都走INDEX FAST FULL SCAN,而涉及排序语句的时候,也许使用INDEX FAST FULL SCAN ,也许使用INDEX FULL SCAN,这是由ORACLE的优化器计算出来的。

5)UNION的合并优化。索引不能消除UNION的排序,因此建议使用UNION ALL
两者都是合并,但是UNION合并后没有重复的记录,而UNION ALL仅仅是合并而已,无法避免重复,因此不需要排序,但是UNION需要去除重复记录,需要排序

猜你喜欢

转载自gaojingsong.iteye.com/blog/2279363