`

Oracle隐藏索引和索引可用性

阅读更多

在我参与过的许多商店系统开发中,我发现在生产系统中创建一个索引并不需要经过详细的论证,甚至连应用程序代码也没有检查就创建了,大多数时候都是靠个人经验和感觉行事的,人们往往只会思考与创建索引有关的列是否会受到影响,完全靠临场反应,到最后数据库中往往有上百个索引创建了但可能从未使用过,或对SQL执行性能有负面影响。作为一名DBA,我们有责任找到并清除这些闲置的以及对性能有负面影响的索引。但我们从哪里开始呢?其实Oracle已经为我们提供了解决之道。

  有两种基本的情况:

  1、 我们必须确定索引是否被使用,如果索引没有使用,只需要删除它就可以了。

  2、 如果索引被使用了,或认为索引将会被使用,对于这种索引,要确定索引对数据库性能的影响稍微有点难度。

  对于第一种情况(判断索引是否被使用),我们可以对数据库索引进行监视,关键是要监视足够长的时间,可以监视一小时,一天,一周或一个业务季度,这要取决于表上的索引是与什么相关的。

  那该如何监视一个索引呢?其实简单得很,只需要使用ALTER INDEX命令,加上MONITORING USAGE子句就可以了,还是来看一看实例吧:

SQL> ALTER INDEX pk_emp MONITORING USAGE;

  
Index altered.

  SQL
> ALTER INDEX ix_emp_sal MONITORING USAGE;

  
Index altered.

  当你在该表上进行SELECT,UPDATE,DELETE(没有INSERT)时,一旦使用了索引,就会在V$OBJECT_USAGE动态视图中将该索引标记为在使用中:

SQL> select * from emp where empno = 7844;

  EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

  
----- ------ --------- ---- --------- ----- ---- ------

  
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30

  SQL
> SELECT v.index_name, v.table_name,

  v.monitoring, v.used,

  start_monitoring, end_monitoring

  
FROM v$object_usage v, user_indexes u

  
WHERE v.index_name = u.index_name;

  INDEX_NAME TABLE_NAME MON
USE START_MONITORING END_MONITORING

  
---------- ---------- --- --- ------------------- -------------------

  PK_EMP EMP YES YES
04/28/2009 10:16:51

  IX_EMP_SAL EMP YES NO
04/28/2009 10:17:01

  就这么简单。显然,如果前面的SELECT语句只是查询EMP表,或许我们应该删除掉IX_EMP_SAL索引。

  如果索引已经被使用,或将被使用,在采取行动(如删除或创建索引)之前,我们必须放聪明点。为了帮助解决这些问题,Oracle为我们提供了一个新特性,INVISIBLE索引,允许我们将索引隐藏起来,隐藏的索引不能使用,但仍然可以通过INSERT,UPDATE和DELETE进行维护。要使一个索引不可见,可以使用CREATE或ALTER INDEX INVISIBLE命令,这里以上面的IX_EMP_SAL索引为例进行演示:

>SQL> create index ix_emp_sal on emp(sal) INVISIBLE;

  SQL
> alter index ix_emp_sal INVISIBLE;

  当一个索引被置为INVISIBLE时,应用程序就看不到它了,也不能在任何DML操作中使用它了。优化器也看不到隐藏索引,因此也不会被任何执行计划使用,除非明确指定了一个提示(hint),会话被设置为使用隐藏索引,或者数据库被设置为可以使用所有的隐藏索引,这正是某些DBA梦寐以求的功能,使用一个新的init.ora参数optimizer_use_invisible_indexes,你可以固定会话,或全系统范围内都可以使用隐藏索引,让你有机会测试新建索引在完全移动到生产环境之前的影响,可以通过设置这个初始化参数使用隐藏索引,或在SQL中增加提示使用隐藏索引,如: 

>SQL> alter system set optimizer_use_invisible_indexetrue;

  SQL
> alter session set optimizer_use_invisible_indexetrue;

  SQL
> select * /*+ index (emp ix_ep_sal) */ ename from emp where sal=1500;

  要使一个索引从不可见状态变为可见状态,使用ALTER INDEX语句+ VISIBLE关键字即可:

>SQL> alter index ix_emp_sal VISIBLE;

  此外,如果你想找出在你的数据库中哪些索引是隐藏的,可以查询DBA_,USER_或ALL_INDEXES视图中的VISIBILITY列。

> SQL>select index_name, visibility

  
from dba_indexes

  
where index_name='IX_EMP_SAL';

  INDEX_NAME VISIBILIT

  
-------------- ---------

  IX_EMP_SAL INVISIBLE

  在运用INVISIBLE索引功能时要注意由其它方法创建或修改的隐藏索引,如果你以前写有一个SQL查看索引的结构,现在需要修改一下增加检查VISIBILITY列,否则你看到的仅仅是索引的部分信息,当执行了大量的INSERT,UPDATE或DELETE操作时,这可能会变成一个隐藏的恶梦。

  索引的可用性一向有些黑色艺术,对于删除一个索引是否会对性能产生影响从来都没有明确的判断标准,现在通过监视索引的可用性,并可以修改索引的可见性,DBA完全可以更好地测试和验证索引的可用性了。

分享到:
评论

相关推荐

    Oracle 分区索引介绍和实例演示

    同时把分区放在不同的表空间可以提高分区的可用性和可靠性。本文主要描述了分区索引的相关特性并给出演示示例。 1、分区索引的相关概念 a、分区索引的几种方式:表被分区而索引未被分区;表未被分区,而索引被分区;...

    Oracle分区表和索引

    1、 大数据量的表,比如大于2GB。一方面2GB文件对于32位... 分区独立性:即使某些分区不可用,其他分区仍然可用。  最多可以分成64000个分区,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。

    oracle数据库面试题目汇总

    通常都有什么模型来解决mysql高可用性 mysql创建可以允许远程登录,只能管理test数据库下所有表的用户,写出命令 用过memecached吗?它是用来解决什么问题的? 了解nginx吗?说明nginx为什么比apache等web容器高...

    Oracle数据库管理员技术指南

    9.1.1 设计的稳定性和存储概要 9.1.2 排序改进 9.1.3 实体化视图 9.1.4 利用 DBMS_STATS 收集性能统计 数据 9.2 新索引类型 9.2.1 基于函数的索引 9.2.2 反向键索引 9.2.3 降序索引 9.2.4 索引编排表 ...

    Oracle Database 11g完全参考手册中文版.part1

    全部分两部分打包上传,此为第一部分。 简介:初学oracle必须的学习手册,初学oracle必须的学习手册 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle ...使用Oracle实时应用群集(RAC)优化可用性和可扩展性

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    11.1 Oracle索引概述 422 11.2 B*树索引 423 11.2.1 索引键压缩 426 11.2.2 反向键索引 429 11.2.3 降序索引 435 11.2.4 什么情况下应该使用B*树索引? 437 11.2.5 B*树小结 448 11.3 位图索引 448 11.3.1 ...

    专家精讲:Oracle数据库管理与维护 完整版 (第三部)

    针对常用的“基本对象”及延伸应用的“高可用性对象”提供详尽说明;详解Oracle数据库的安装、建置,以及安全认证方式;深入剖析Oracle的网络联机架构与设定,包含各类“网络服务组态文件”;详细介绍Oracle数据库的...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    Oracle 10g Concepts 中文版

    Chapter 17, High Availability 第 17 章,高可用性 Chapter 18, Partitioned Tables and Indexes 第 18 章,分区表及分区索引 Chapter 19, Content Management 第 19 章,内容管理 Chapter 20, Database ...

    Oracle 10g r2 Concepts 手册(中英文对照阅读版本).chm

    Chapter 17, High Availability 第 17 章,高可用性 Chapter 18, Partitioned Tables and Indexes 第 18 章,分区表及分区索引 Chapter 19, Content Management 第 19 章,内容管理 Chapter 20, Database ...

    Oracle Concepts中英文对照版(10g R2).chm

    14 章,可管理性 Chapter 15, Backup and Recovery 第 15 章,备份与恢复 Chapter 16, Business Intelligence 第 16 章,业务智能 Chapter 17, High Availability 第 17 章,高可用性 Chapter 18, ...

    专家精讲:Oracle数据库管理与维护 完整版(第2部分)

    针对常用的“基本对象”及延伸应用的“高可用性对象”提供详尽说明;详解Oracle数据库的安装、建置,以及安全认证方式;深入剖析Oracle的网络联机架构与设定,包含各类“网络服务组态文件”;详细介绍Oracle数据库的...

    Oracle Database 11g初学者指南--详细书签版

    第8章 高可用性:RAC、ASM和 Data Guard 215 8.1 高可用性定义 216 8.2 了解RAC 216 8.3 安装RAC 217 8.4 测试RAC 221 8.4.1 负载平衡管理器 221 8.4.2 ASM 222 8.5 设置ASM实例 222 8.6 创建ASM磁盘组 227 ...

    Oracle Database 11g完全参考手册中文版.part2

    全部分两部分打包上传,此为第二部分。 简介:初学oracle必须的学习手册,初学oracle必须的学习手册 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle ...使用Oracle实时应用群集(RAC)优化可用性和可扩展性

    oracle concepts概念手册中英文版(10gR2)

    Chapter 17, High Availability 第 17 章,高可用性 Chapter 18, Partitioned Tables and Indexes 第 18 章,分区表及分区索引 Chapter 19, Content Management 第 19 章,内容管理 Chapter 20, Database ...

    Oracle_Database_11g完全参考手册.part3/3

     使用Oracle实时应用群集(RAC)优化可用性和可扩展性 内容提要 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

Global site tag (gtag.js) - Google Analytics