这一篇文章我们介绍一下oracle管理索引的手段

索引使用的正确姿势:

  • 如果您经常要查询的数据少于表数据15%,则可以考虑创建索引。
  • 为了提高多个表的连接查询性能,连接的列考虑建索引。
  • 数据量很小的表不需要索引。如果查询花费的时间太长,则表可能已从小变大。

适合建索引的列:

  1. 列的值唯一性很高
  2. 值的范围很广,适合创建常规B-tree索引
  3. 值的范围很小,适合使用位图索引
  4. 列包含大量空值,但查询选择非空的行。在这种情况下,最好加上WHERE COL IS NOT NULL

不适合建索引的列

  1. 列中有许多空值,但不会搜索非空值。
  2. LONG和LONG RAW列无法建立索引

索引列的顺序对性能的影响

CREATE INDEX语句中的列的顺序可能会影响查询性能。通常,创建复合索引时,经常使用的列放在第一个。

如果我们创建一个复合索引来加快访问查询的速度,例如col1,col2和col3;然后,仅访问col1或仅访问col1和col2的查询速度都将加快。但是仅访问col2,仅col3或仅col2和col3的查询不会使用索引。

一张表索引数量有限制吗?

一个表可以建任意数量的索引。但是,索引越多,修改表的开销就越大。具体来说,当插入或删除行时,表上的所有索引也必须更新。此外,更新列时,必须更新包含该列的所有索引。

什么情况下删除索引?

  • 它不会加快查询速度。该表可能很小,或者表中可能有很多没有索引条目的行。
  • 程序查询不使用索引
  • 重建前删除掉原索引

可以并行创建索引,可以使用nologging创建索引

以上两种操作都是节省创建索引的时间,当然并行创建需要更多的进程,那么就需要更多的资源。nologging选项可以减少redo的产生,并行创建大的索引可以提升性能。

索引不可用:

当往表中导入大量数据的时候,可以使索引先unusable,导入数据后,重建索引,这样可以提升导入的效率。你可以创建一个unusable的索引,可以改变索引状态为unusable,比如,创建索引失败的时候,索引标记为unusable。当一个分区的分区索引标记为unusable的时候,其他分区的索引是可用的。无法使用的索引或分区索引必须重建,删除或重新创建后,才能使用。截断表会使unusable索引变为可用。

SKIP_UNUSABLE_INDEXES参数设置为true时:

  1. 表的DML语句继续执行,但是不会维护索引
  2. 如果有不可用的唯一约束,那么DML会抛出错误终止执行
  3. 对于非分区索引,优化器在为SELECT语句创建执行计划时,不会考虑不可用的索引。唯一的例外是使用INDEX()注释显式指定使用索引。
  4. 对于一个或多个分区不可用的分区索引,如果优化器无法在查询编译时确定是否可以修剪任何索引分区,则优化器不会考虑该索引。对于分区表和非分区表都是如此。唯一的例外是使用INDEX()注释显式指定使用索引。

SKIP_UNUSABLE_INDEXES参数这只为false时:

  1. 如果有不可用的索引或分区索引,则将导致那些索引或索引分区的DML语句会报错终止执行。
  2. 对于SELECT语句,如果存在无法使用的索引或分区索引,但是优化器执行计划没有使用该unusable索引,则该语句继续执行。但是,如果优化器选择使用了该unusable索引或unusable分区索引,则该语句将会报错终止执行。

索引不可见:

从Oracle Database 11g第1版开始,您可以创建不可见索引或使现有索引不可见。除非您在会话或系统级别将OPTIMIZER_USE_INVISIBLE_INDEXES初始化参数显式设置为TRUE,否则优化器将忽略不可见索引。与无效索引不同,在DML语句期间会维护不可见的索引。虽然分区索引可以设置为不可见,但是不能设置一个单独的分区索引不可见而其他的分区索引可见。使用不可见索引,您可以执行以下操作:

  1. 在删除索引之前,测试移除索引。
  2. 为应用程序的某些操作或模块临时使用索引结构,而不会影响整个应用程序。

权衡合并索引还是重建索引

重建索引 合并索引
可以快速移动索引到其他表空间 不能移动索引到其他表空间
高开销,需要更多的磁盘空间 低开销,不需要更多的磁盘空间
创建新树,尽可能的缩小树的深度 在树的同一分支内合并叶块
能够快速更改存储和表空间参数,而不必删除原始索引 快速释放索引叶块以便使用

可以释放B树索引叶子块以供重用,使用以下语句合并这些叶子块:

ALTER INDEX vmoore COALESCE;

图21-1说明了ALTER INDEX COALESCE对索引vmoore的影响。在执行该操作之前,前两个叶块已满50%。因此,可以减少碎片并完全填充第一个块,同时释放第二个块


在禁用或删除约束之前要考虑成本

因为唯一约束和主键约束都有关联的索引,所以在考虑禁用还是删除UNIQUE或PRIMARY KEY约束时,应考虑删除和创建索引的成本。如果UNIQUE键或PRIMARY KEY约束的索引非常大,则可以通过启用约束而不是删除并重新创建索引来节省时间。还可以选择在删除或禁用UNIQUE或PRIMARY KEY约束时明确指定要保留或删除的索引。

下面介绍一下具体的SQL语法实例:

  • 创建索引
CREATE INDEX emp_ename ON emp(ename)TABLESPACE usersSTORAGE (INITIAL 20KNEXT 20k);

这里指定了INITAL和next存储参数

  • 创建唯一索引
CREATE UNIQUE INDEX dept_unique_index ON dept (dname)TABLESPACE indx;
  • 创建与约束相关的索引,多种方法都可实现
CREATE TABLE emp (empno NUMBER(5) PRIMARY KEY, age INTEGER)ENABLE PRIMARY KEY USING INDEXTABLESPACE users;
CREATE TABLE a (a1 INT PRIMARY KEY USING INDEX (create index ai on a (a1)));
CREATE TABLE b(b1 INT, b2 INT, CONSTRAINT bu1 UNIQUE (b1, b2) USING INDEX (create unique index bi on b(b1, b2)),CONSTRAINT bu2 UNIQUE (b2, b1) USING INDEX bi);
CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
  • 创建极大的索引
  1. 创建一个大的临时表空间,分配给创建索引的时候使用
  2. 使用alter user切换使用的临时表空间
  3. 创建索引
  4. 删除这个大的临时表空间,使用alter user命令切换回原来的临时表空间
  • 在线创建索引
CREATE INDEX emp_name ON emp (mgr, emp1, emp2, emp3) ONLINE;
  • 创建函数索引
CREATE INDEX area_index ON rivers (area(geo));
以下语句可能使用索引
SELECT id, geo, area(geo), descFROM rivers     WHERE Area(geo) >5000;
  • 创建压缩索引
CREATE INDEX  emp_ename ON emp(ename)TABLESPACE usersCOMPRESS 1;也可以在重建期间指定压缩
ALTER INDEX emp_ename REBUILD NOCOMPRESS;
  • 创建无效索引
sh@PROD> CONNECT hr
Enter password: **
Connected.hr@PROD> CREATE TABLE employees_part2    PARTITION BY HASH (employee_id) PARTITIONS 23    AS SELECT * FROM employees;Table created.hr@PROD> SELECT COUNT(*) FROM employees_part;COUNT(*)
----------107
下面创建一个无效的分区索引,p1_i_emp_ename为无效索引
hr@PROD> CREATE INDEX i_emp_ename ON employees_part (employee_id)2    LOCAL (PARTITION p1_i_emp_ename UNUSABLE, PARTITION p2_i_emp_ename);Index created.可以通过数据字典查询无效索引,下面可以看到P1_I_EMP_ENAME为无效索引hr@PROD> SELECT INDEX_NAME AS "INDEX OR PARTITION NAME", STATUS2  FROM   USER_INDEXES3  WHERE  INDEX_NAME = 'I_EMP_ENAME'4  UNION ALL5  SELECT PARTITION_NAME AS "INDEX OR PARTITION NAME", STATUS6  FROM   USER_IND_PARTITIONS7  WHERE  PARTITION_NAME LIKE '%I_EMP_ENAME%';INDEX OR PARTITION NAME        STATUS
------------------------------ --------
I_EMP_ENAME                    N/A
P1_I_EMP_ENAME                 UNUSABLE
P2_I_EMP_ENAME                 USABLE可以查询数据字典查看索引是否分配了存储,也就是索引段,下面可见P1_I_EMP_ENAME没有分配索引段hr@PROD> COL PARTITION_NAME FORMAT a14
hr@PROD> COL SEG_CREATED FORMAT a11
hr@PROD> SELECT p.PARTITION_NAME, p.STATUS AS "PART_STATUS",2         p.SEGMENT_CREATED AS "SEG_CREATED",   3  FROM   USER_IND_PARTITIONS p, USER_SEGMENTS s4  WHERE  s.SEGMENT_NAME = 'I_EMP_ENAME';PARTITION_NAME PART_STA SEG_CREATED
-------------- -------- -----------
P2_I_EMP_ENAME USABLE   YES
P1_I_EMP_ENAME UNUSABLE NO
  • 创建不可见索引
CREATE INDEX emp_ename ON emp(ename)TABLESPACE usersSTORAGE (INITIAL 20KNEXT 20k)INVISIBLE;
  • 重建索引
重建索引时,将现有的索引用作数据源。以这种方式创建索引可以更改存储参数或更改表空间。根据现有数据源重建索引可消除块内碎片。与删除索引,然后create index相比,这种方式提供更好的性能。
ALTER INDEX emp_name REBUILD;
在线重建,在重建的同时可以更新表
ALTER INDEX emp_name REBUILD ONLINE;
  • 使索引不可用
查看数据字典,可以看到那些索引可用,那些不可用
hr@PROD> SELECT INDEX_NAME AS "INDEX OR PART NAME", STATUS, SEGMENT_CREATED2  FROM   USER_INDEXES3  UNION ALL4  SELECT PARTITION_NAME AS "INDEX OR PART NAME", STATUS, SEGMENT_CREATED5  FROM   USER_IND_PARTITIONS;INDEX OR PART NAME             STATUS   SEG
------------------------------ -------- ---
I_EMP_ENAME                    N/A      N/A
JHIST_EMP_ID_ST_DATE_PK        VALID    YES
JHIST_JOB_IX                   VALID    YES
JHIST_EMPLOYEE_IX              VALID    YES
JHIST_DEPARTMENT_IX            VALID    YES
EMP_EMAIL_UK                   VALID    NO
.
.
.
COUNTRY_C_ID_PK                VALID    YES
REG_ID_PK                      VALID    YES
P2_I_EMP_ENAME                 USABLE   YES
P1_I_EMP_ENAME                 UNUSABLE NO22 rows selected.选定要不可用的索引进行修改,下面例子一个是普通索引,一个是分区索引
hr@PROD> ALTER INDEX emp_email_uk UNUSABLE;Index altered.hr@PROD> ALTER INDEX i_emp_ename MODIFY PARTITION p2_i_emp_ename UNUSABLE;Index altered.查看修改后的索引状态
hr@PROD> SELECT INDEX_NAME AS "INDEX OR PARTITION NAME", STATUS, 2  SEGMENT_CREATED3  FROM   USER_INDEXES4  UNION ALL5  SELECT PARTITION_NAME AS "INDEX OR PARTITION NAME", STATUS, 6  SEGMENT_CREATED7  FROM   USER_IND_PARTITIONS;INDEX OR PARTITION NAME        STATUS   SEG
------------------------------ -------- ---
I_EMP_ENAME                    N/A      N/A
JHIST_EMP_ID_ST_DATE_PK        VALID    YES
JHIST_JOB_IX                   VALID    YES
JHIST_EMPLOYEE_IX              VALID    YES
JHIST_DEPARTMENT_IX            VALID    YES
EMP_EMAIL_UK                   UNUSABLE NO
.
.
.
COUNTRY_C_ID_PK                VALID    YES
REG_ID_PK                      VALID    YES
P2_I_EMP_ENAME                 UNUSABLE NO
P1_I_EMP_ENAME                 UNUSABLE NO22 rows selected.通过查询i_emp_ename和emp_email_uk段所占用的空间,可以显示这些索引段不再存在:hr@PROD> SELECT SEGMENT_NAME, BYTES2  FROM   USER_SEGMENTS3  WHERE  SEGMENT_NAME IN ('I_EMP_ENAME', 'EMP_EMAIL_UK');no rows selected
  • 使索引不可见
使索引不可见
ALTER INDEX index INVISIBLE;使不可见的索引可见
ALTER INDEX index VISIBLE;查询索引的可见性
SELECT INDEX_NAME, VISIBILITY FROM USER_INDEXESWHERE INDEX_NAME = 'IND1';INDEX_NAME   VISIBILITY
----------   ----------
IND1         VISIBLE重命名索引
ALTER INDEX index_name RENAME TO new_name;
  • 监控索引使用
Oracle数据库提供了一种监视索引,确定是否正在使用索引的方法。如果未使用索引,则可以将其删除,从而消除不必要的开销
监控索引是否使用
ALTER INDEX index MONITORING USAGE;
不监控是否使用
ALTER INDEX index NOMONITORING USAGE;可以在视图V$OBJECT_USAGE中查询正在监视的索引,查看是否已使用该索引。该视图包含一个USED列,其值是YES或NO,这取决于监视的时间段内是否使用索引。该视图还包含监视时段开始和停止时间,以及MONITORING列(YES/NO),用于说明当前监视是否处于激活状态。每次指定MONITORING USAGE时,都会为指定的索引重置V$OBJECT_USAGE视图。以前的使用信息将被清除重置,并记录新的开始时间。当您指定NOMONITORING USAGE时,将不执行监视,并且将记录监视时间的结束时间。在ALTER INDEX ... MONITORING USAGE语句发出之前,视图信息将保持不变。
  • 监控索引空间的使用
如果索引的键值频繁插入,更新和删除,则索引随着时间越长,索引会发生膨胀。通过分析索引结构,使用ANALYZE INDEX ... VALIDATE STRUCTURE语句,然后查询INDEX_STATS视图,定期监视索引的空间使用效率:
SELECT PCT_USED FROM INDEX_STATS WHERE NAME = 'index';
  • 删除索引
通常比如索引没有使用,索引状态为invalid状态,或其他原因,都可以通过以下语句删除索引
注意,如果这个索引是和约束相关联的,那么需要禁用或者删除约束后,再删除索引
DROP INDEX emp_ename;
  • 相关数据字典介绍

DBA打头的视图描述了数据库中所有表的索引信息。 ALL打头的视图描述用户可访问的所有表上的索引信息。 USER打头的视图仅限于用户拥有的索引信息。这些视图中的某些列包含由DBMS_STATS包或ANALYZE语句生成的统计信息。
DBA_INDEXES
ALL_INDEXES
USER_INDEXES

以下视图描述了表上索引列的信息
DBA_IND_COLUMNS
ALL_IND_COLUMNS
USER_IND_COLUMNS

这些视图描述表上基于函数索引的表达式
DBA_IND_EXPRESSIONS
ALL_IND_EXPRESSIONS
USER_IND_EXPRESSIONS

这些视图包含每个分区索引的信息,分区级别的信息,该分区的存储参数以及由DBMS_STATS包生成的各种分区统计信息
DBA_IND_PARTITIONS
ALL_IND_PARTITIONS
USER_IND_PARTITIONS

这些视图包含索引的优化器统计信息
DBA_IND_STATISTICS
ALL_IND_STATISTICS
USER_IND_STATISTICS

存储最新一次发出ANALYZE INDEX…VALIDATE STRUCTURE语句的统计信息
INDEX_STATS
INDEX_HISTOGRAM

包含了由ALTER INDEX … MONITORING USAGE产生的索引使用信息
V$OBJECT_USAGE

oracle索引管理相关推荐

  1. oracle nolgging,ORACLE创建管理索引

    ORACLE索引管理需要遵从一系列的指导原则,包含以下内容: 插入表数据之后再创建索引 针对合理的表和列创建索引 对索引列的顺序进行排列来提升性能 限制每个表的索引的个数 删除不再需要的索引 估计索引 ...

  2. Oracle索引树的结构

    关于Oracle索引树的结构以及它们对Oracle性能调优是否重要存在大量的.激烈的争论,而且已经有很多文章试图来描述这些重要的Oracle性能工具的内部工作机制.关于这个论题也出现了一些新书,例如由 ...

  3. oracle如何进入管理器,oracle 启动管理器

    oracle 启动管理器 emctl start dbconsole 是10g的启动console服务的命令 将OEM服务停止emctl stop dbconsole emctl start dbco ...

  4. Oracle用户管理学习总结

    Oracle 用户管理 一.用户的概念 用户,即user,通俗的讲就是访问oracle数据库的"人".在oracle中,可以对用户的各种安全参数进行控制,以维护数据库的安全性,这些 ...

  5. [转]Oracle DB 管理ASM实例

    • 描述使用ASM 的好处 • 管理ASM 实例 • 创建和删除ASM 磁盘组 • 扩展ASM 磁盘组 • 通过使用各种实用程序检索ASM 元数据 Automatic Storage Manageme ...

  6. ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...

    墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门.索引管理.映射详解,本文详细介绍ElasticSearch的索引别名.分词器.文档管理.路由.搜索详解. 一.索引别名 1. ...

  7. ElasticSearch最全详细使用教程:入门、索引管理、映射详解

    墨墨导读:本文介绍了ElasticSearch的必备知识:从入门.索引管理到映射详解. 一.快速入门 1. 查看集群的健康状况http://localhost:9200/_cat http://loc ...

  8. SQL索引管理器——用于SQL Server和Azure上的索引维护的免费G​​UI工具

    目录 介绍 主意 实现 结果和计划 下载源 - 16.3 MB 下载 SQL 索引管理器 v1.0.0.68.zip - 16.2 MB 下载 SQL 索引管理器 v1.0.0.67.zip - 16 ...

  9. SQL索引管理器——用于SQL Server和Azure上的索引维护的免费GUI工具

    目录 介绍 理念 实现 结果和计划 介绍 我作为SQL Server DBA工作了8年多,管理和优化服务器的性能.在我的空闲时间,我想为世界和我的同事做一些有用的事情.这就是我们最终为SQL Serv ...

最新文章

  1. @query 注解的定义_SpringDataJpa(5)---定义查询方法
  2. sql 存储过程 分页
  3. python 装饰器实现缓存_Python, 这一个缓存装饰器, 其执行流程是怎样的?
  4. 微型计算机常用的总线类型,常见总线有哪些类型
  5. Linux shell if判断=左右必须要有空格
  6. FineUICore(基础版)v5.4.0已发布!
  7. strtus2改成springboot_springboot+struts2打成jar包运行
  8. java 和javafx_Java,JavaFX的流利设计风格文本字段和密码字段
  9. 火狐导cookie文件没反应_效率指南|实操区分FireFox火狐的国内版和国际版
  10. C语言使用函数必须知道的3点注意事项!
  11. MATrICP论文解读
  12. 压力测试实践一:JMeter + JProfiler 入门
  13. LTT (Linux Trace Toolkit) 简介
  14. 多域名证书的签名和自签名流程
  15. linux数据库定期备份,linux数据库定期备份
  16. PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别
  17. java做eda开发_Java学习笔记——EDA事件驱动架构,你掌握了吗
  18. python背景颜色代码大全_Python实现转换图片背景颜色代码
  19. Pearson 相关分析 理论与应用
  20. gitter 卸载_最佳的Gitter渠道:数据科学和机器学习

热门文章

  1. Eigenvalue of random matrix
  2. Linux命令之dos2unix
  3. node 连接MySQL
  4. Pytorch框架之one_hot编码函数
  5. 从刘维尔方程到Velocity-Verlet算法
  6. Mega2560串口通信实现
  7. 金属铣床行业现状调研及趋势分析报告
  8. 这八个网站,是最有良心的分享,没有之一!
  9. 拉格朗日乘数法求可能极值
  10. 电脑上有哪些好用的视频剪辑软件