INDEX

--索引候选列:

当执行分级查询(也就是包含connect  by 的查询),应该为start  with  和 connect  by子句所引用的列添加索引。

--索引的详细信息

SELECT T.TABLE_NAME, T.INDEX_NAME,T.INDEX_TYPE, T.TABLESPACE_NAME, STATUS

  FROM USER_INDEXES T

 WHERE TABLE_NAME IN ('EMP', 'DEPT');

--索引所在列

SELECT F.TABLE_NAME, F.INDEX_NAME,F.COLUMN_NAME, F.COLUMN_POSITION

  FROM USER_IND_COLUMNS F

 WHERE F.TABLE_NAME IN ('EMP', 'DEPT')

 ORDERBY F.TABLE_NAME, F.INDEX_NAME, F.COLUMN_POSITION;

--索引所占用大小

SELECT A.SEGMENT_NAME,A.SEGMENT_TYPE, A.EXTENTS, A.BYTES

  FROM USER_SEGMENTS A, USER_INDEXES B

 WHERE A.SEGMENT_NAME = B.INDEX_NAME

   AND B.TABLE_NAME IN ('EMP', 'DEPT')

--反编译索引的DDL语句

SELECT DBMS_METADATA.GET_DDL('INDEX', 'IND_EMP_1') FROM DUAL;

--反编译某张表所有索引的DDL语句

SELECT K.TABLE_NAME,

       K.INDEX_NAME,

       DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME)

  FROM USER_INDEXES K

 WHERE K.TABLE_NAME = 'EMP';

--使索引不可用(一般是在表组要批量加载数据时操作,之后再重建该索引即可)

ALTER  INDEX EMP_NAME_IDX UNUSABLE

--重建索引

ALTER  INDEX pk_emp REBUILD;

oracle 索引监控

    即使是一个初期设计非常优秀的数据库系统,在持续运行一段时间后,由于数据量的累加,数据库对象的变化,甚至是业务方面的改变,多可能会对数据库的性能带来影响。所以一个持续、健康的数据库系统,时常在半年或一年进行一次全面体检。其中极其重要的体检的指标就是对索引的修改。有可能当初设计合理的索引现在没有发挥大的作用,也有可能已经完成没有作用,甚至可能对数据库性能产生了负担。。。那么就需要我们去监控、分析、修改甚至删除了。

如果确定某个索引不再使用了,那么可以删除它,在删除之前,应采取必要的预防措施,以确保不会对性能产生不利影响。如果可能的话可以在测试环境里测试。如果没有测试环境,那么在删除前考虑做以下工作:

启用对索引的监控。监控索引会让你了解应用程序的select语句是否使用了它。

使索引不可见(需要11g版本支持)。oracle 内部能可用并维护,但查询优化器确定执行计划时不再考虑此索引。Alterindex index_name (in)visible;

使索引不可用。Oracle优化器不会考虑也不会维护,但不会删除它,如果需要重启不可用的索引,那么必须重建它。Alter index index_name rebuild;

--监控某个索引在一定时间段内是否使用

首先修改索引为监控状态

ALTERINDEX  INDEX_NAME MONITORINGUSAGE;

然后发出相应的查询语句。

之后用下列语句查询是否使用

SELECT*  FROM  V$OBJECT_USAGE;

监控完之后关闭监控状态

ALTERINDEX  INDEX_NAME NOMONITORINGUSAGE;

 

--另(生成所有索引的修改为监控或关闭监控的语句)

SELECT'ALTER INDEX  ' || OWNER || '.' || INDEX_NAME || ' (no)MONITORING USAGE;'

  FROM DBA_INDEXES

WHERE OWNER NOTIN('SYS', 'SYSTEM')

 

 

1. 访问路径是优化器从数据库检索数据的路径,索引访问和全表扫描是两种基本的访问路径。

2. 在下列情况下即使表上存在索引,但优化器一般也会倾向使用全表扫描

被访问的表较小,只有少数的几个块组成。

需要从表中获取大量的数据。

Where 子句引用的索引列上只存在极少数不同的值。

表上定义了较高的并行度。

3. 索引唯一扫描:当查询只包含某个唯一索引中的列或者在主键约束列上指定了相等条件时。

4. 索引范围扫描:当需要访问具有高度选择性的数据时。数据库按照升序返回索引列的值。如果所有行的索引列都是相同的,则按rowid的顺序输出。当处理以下类型的条件时,优化器选择索引范围扫描,其中col1是某个索引的前导列:

Col1=:b1

Col1<:b1

Col1>:b1

此外 ,包含索引前导列的上述三种条件的任何AND 组合,也将导致使用索引范围扫描。当使用between操作符时,也执行索引范围扫描。索引降序范围扫描(index rand scan descending)操作与索引范围扫描非常类似,但为了避免降序排序操作,索引降序范围扫描操作向后读取索引,以避免按正常次序(升序)读取,然后再执行降序排序操作。

5. 当一个查询未在where子句中的谓词中指定复合索引的前导列,查询:“跳过”该列时,就会发生索引跳跃式扫描。数据库将一个复合索引拆分成多个逻辑子索引。复合索引前导列中的不同值越少,组成复合索引的其他键的不同值越多,索引跳跃式扫描的性能就越好。

6. Drop   index index_name 可以删除任何明确创建的索引,然而,不能删除任何隐式创建的索引,例如:通过定义表上的键约束创建的索引(只能通过删除(或禁用)约束本身,来删除它)。否则会出现ora-02429 :无法删除用于强制唯一/主键的索引  的错误提示。如果删除了某个表,那么表上所有的索引就会删除。

 


 

你可能感兴趣的:(index)