| 首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
| 2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
| 四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语 |
||
| 计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
| 公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平 驾驶员 | 网络编辑 |
||
| 卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
| 会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
| 一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 |
||
| 缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 | ||
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完全可以更好地测试和验证索引的可用性了。
相关推荐:如何更改监听器日志文件名称