谈一下oracle索引

索引的应用:
索引的分类:
逻辑分类:
单列索引 & 复合列索引
create index i_emp_ename on emp (ename);
create index i_emp_3 on emp (empno,ename,sal);
非唯一键索引 & 唯一键索引
create unique index i_emp_ename on emp (ename);
基于函数的索引
create index i_emp_ename on emp (lower(ename));
应用程序域索引:

oracle查看表是否有索引:
select index_name from user_indexes where table_name=‘EMP‘;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
物理分类:
非分区索引 & 分区索引
B-Tree索引:
  常规B-Tree  :
  反向键B-Tree:create index i_emp_ename on emp (ename) reverse;

Bitmap索引:适合使用在低基数列(重复值多的列:性别)
create bitmap index i_ob1_id on ob1 (object_id);

SQL> create index i_e01_empno on e01 (empno);
SQL> create bitmap index i_e01_empno on e01 (empno);
SQL> select blocks/128 from user_segments where segment_name=‘I_E01_EMPNO‘;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
影响索引使用的因素:
1.空值影响B-Tree索引的使用:B-Tree索引不记录空值
create index i_emp_ename on emp (ename);
SQL> analyze index i_emp_ename validate structure;
SQL> select NAME,HEIGHT,BLOCKS,BR_BLKS,BR_ROWS,LF_BLKS,LF_ROWS from index_stats;
alter table e01 modify (empno number not null);

合并索引叶集块碎片:不会降低索引的二元高度
SQL> alter index I_EMP_ENAME coalesce;

如果需要降低索引的二元高度使用重建索引
SQL> alter index I_EMP_ENAME rebuild; --> 使用现有索引的关键字重建新索引
SQL> alter index I_EMP_ENAME rebuild online;

报如下错误,需要online解决。比如:rebuild online
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

SQL> create index I_EMP_ENAME on emp (ename) online;

2.隐式数据类型
create table t01 (code_id varchar2(20));
insert into t01 values (1);
create index i_t01_code on t01 (code_id);
select * from t01 where code_id=1;
select * from t01 where code_id=‘1‘;

3.初始化参数影响索引使用:索引权重
optimizer_index_cost_adj=[1~10000]%

alter session set optimizer_index_cost_adj=50;
全表的成本 PK 索引访问的成本*optimizer_index_cost_adj

4.索引的聚簇因子:顺序访问索引键值而在表的数据块上面跳转的次数;反映的是通过索引顺序取值对表的数据块访问的次数

select * from e02 where empno<46572; --> .203037807

select * from e01 where empno<376;   --> .00163923

empno<2000

select dbms_rowid.rowid_block_number(rowid),count(*) from e01 where empno<2000 group by dbms_rowid.rowid_block_number(rowid);

select blocks from user_segments where segment_name=‘E01‘;
select blocks from user_tables where table_name=‘E01‘;

select dbms_rowid.rowid_block_number(rowid),count(*) from e02 where empno<2000 group by dbms_rowid.rowid_block_number(rowid);

select blocks from user_segments where segment_name=‘E02‘;
select blocks from user_tables where table_name=‘E02‘;

SQL> select index_name,clustering_factor from user_indexes where index_name in (‘I_E01_EMPNO‘,‘I_E02_EMPNO‘);

INDEX_NAME               CLUSTERING_FACTOR
------------------------------ -----------------
I_E01_EMPNO                  229204
I_E02_EMPNO                    1384
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alter table ob1 modify (object_id number not null)
索引的扫描算法和效率:
索引的唯一键扫描:INDEX UNIQUE SCAN
select * from emp where empno=7839;

索引的快速全扫描:INDEX FAST FULL SCAN,不读取根与分枝块,只读取叶子,而且使用批量读取,结果无序
select object_id from ob1;

索引的全扫描:INDEX FULL SCAN,结果有序
select object_id from ob1 order by 1;

索引的范围扫描:INDEX RANGE SCAN
select * from ob1 where object_id<100;

索引的跳跃扫描:复合列索引,前导列在where子句中不能出现,索引列要拥有列级别的统计信息
analyze table ob1 compute statistics for all indexed columns;
create index i_ob1 on ob1 (owner,object_type,object_name);
select owner,object_type,object_name from ob1 where object_type=‘WINDOWS‘;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
打开sql自动跟踪
SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
SET AUTOT ON
SET AUTOT TRACE
SET AUTOT TRACE EXP
SET AUTOT TRACE STAT
关闭sql自动跟踪
SET AUTOT OFF

select /*+index(dept pk_dept)*/ * from scott.dept;

select distinct FILE#,BLOCK# from v$bh where objd=dba_objects.data_object_id;

select object_name,data_object_id from dba_objects where object_name in (‘DEPT‘,‘PK_DEPT‘);
select count(*) from v$bh where objd=87106;
select FILE#,BLOCK# from v$bh where objd=87106;
select distinct FILE#,BLOCK# from v$bh where objd=87106;

时间: 2024-10-20 05:01:17

谈一下oracle索引的相关文章

详谈 oracle 索引 (笔记)

1.oracle索引空值问题 当在有空值得列上建立单列索引时,如果搜索条件为 is null 在解释计划中可以看到,对于此列oracle并没有使用索引查询: 但是当建立的是多列索引是,就会按照索引来进行查询. 2.B-树索引 示意图: 在B-树索引中,将会按照从上到下的顺序进行索引.如果列的选择度不低的话,索引扫描就会很慢.原因就在于要遍历很多的叶子快来取出不同的行编号. 随着出入数据的增多,最右侧的叶子块也在一直的增大,可能会导致缓冲区的繁忙等待.这种类型的最右侧索引的快速增长被称为 右侧增长

Oracle 索引 简介

1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC, <column_name> | <expression> ASC | DESC,...) TABLESPACE <tablespace_name>

Oracle索引

Oracle索引,码迷,mamicode.com

oracle索引总结

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! oracle索引总结 简介 1.说明 1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息. 2)索引是建立在表上的可选对象:索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率 3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表:

【Oracle】Oracle索引

在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. 索引分类: 逻辑分类 single column or concatenated    对一列或多列建所引 unique or nonunique  唯一的和非唯一的所引,也就是对某一列或几列的键值(key

【转】Oracle索引HINT的使用

转自:Oracle索引HINT的使用       存储在数据库中数据的分布情况开发人员或管理员比Oracle优化器更加的清楚,在优化器不能作出最有查询路径选择的情况下,使用HINT(提示)人为的固定查询路径,一定程度能生成更优的执行计划.         在SQL的查询过程中,索引是快速查询数据的方法之一,是最重要.最常见的手段,这篇文章将讨论和索引相关的HINT的使用. 1.HINT的使用方法: select /*+ INDEX (tab pk_tab)*/ * from test.tab;

oracle索引的理解

1.当查询表时where条件中有多个索引时,优先使用主键索引,其它索引会失效. 2.当查询的返回的数据占总量数据的百分比小于20%时,建索引才有效果 3.不是主键的索引值可以为空,主键索引不能为空. 4. 容易引起oracle索引失效的原因很多: 1).在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2).新建的表还没来得及生成统计信息,分析一下就好了 3).基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引.

[转]Oracle 索引质量分析

http://blog.csdn.net/leshami/article/details/23687137 索引质量的高低对数据库整体性能有着直接的影响.良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置.因此对于索引在设计之初需要经过反复的测试与考量.那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能.下面给出了演示以及索引创建的基本指导原则,最后给出了索引

oracle 索引失效原因

摘自网络http://blog.chinaunix.net/uid-23622436-id-3184356.html oracle 索引失效的原因 分类: Oracle 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其实也包含了上面的情况,这里指的是