网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.理解NULL是如何影响IN和EXITS语句.
.ORACLE问题,每天10问(十).
.[Oracle] 几本重要的电子图书下载.
.ORA-01157问题解决.
.深入分析Oracle数据库日志文件.
.Oracle DBA 创建数据库试题选.
.讲解Oracle数据库自动增长列的实.
.Oracle数据库技术(38).
.数据库dblink介绍.
.了解Oracle Developer.
.Oracle DBA如何管理DB2.
.ORACLE关于bin目录下各文件的意义.
.Oracle on Linux认证--IT认证完美.
.Oracle数据库的热备份与完整恢复.
.Oracle中如何直接运行OS命令(上).
.有关CBO优化的几个问题.
.Oracle9i如何支持动态重配置.
.Solaris下Oracle的基本操作.
.提高查询主、从表速度的一个方法.
.oracle9.i数据库.

Oracle9i中如何监视索引并清除监视信息

发表日期:2008-2-9



  对于DML操作来说,索引对于数据库是一个性能负担.假如索引没有被有效的使用,那么其存在性就值得从新考虑.
  
  1. 从Oracle9i开始,Oracle答应你监视索引的使用:
  
  SQL> connect scott/tiger@conner
  Connected to Oracle9i Enterprise Edition Release 9.2.0.4.0
  Connected as scott
  
  SQL> select index_name from user_indexes;
  
  INDEX_NAME
  ------------------------------
  PK_DEPT
  PK_EMP
  
  开始监视pk_dept索引:
  
  SQL> alter index pk_dept monitoring usage;
  
  Index altered
  
  在此过程中,假如查询使用索引,将会记录下来:
  
  SQL> select * from dept where deptno=10;
  
  DEPTNO DNAME     LOC
  ------ -------------- -------------
  10 ACCOUNTING   NEW YORK
  
  停止监视:
  
  SQL> alter index pk_dept nomonitoring usage;
  
  Index altered
  
  查询索引使用情况,YES表示在监视过程中索引被使用到:
  
  SQL> select * from v$object_usage;
  
  INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING  END_MONITORING
  ----------------- ------------------ ---------- ---- ------------------- --
  PK_DEPT   DEPT    NO     YES 10/28/2004 10:55:19 10/28/2004 10:55:47
  
  SQL>
  
  2.Oracle9i的Bug
  
  在9205之前,假如你不慎监控了SYS.I_OBJAUTH1索引,并且不幸在重起数据库之前没有停止它,那么你的数据库将会无法启动,并且
  不会给出任何错误信息。
  
  以下这条简单的语句可以轻易再现这个问题:
  
  'ALTER INDEX SYS.I_OBJAUTH1 MONITORING USAGE'
  
  假如你有了足够好的备份(严重警告,请不要拿你的生产数据库进行测试),你可以尝试一下:
  
  [oracle@jumper oradata]$ sqlplus "/ as sysdba"
  SQL*Plus: Release 9.2.0.4.0 - ProdUCtion on Sat Dec 4 10:09:30 2004
  
  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
  
  Connected to:
  Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
  With the Partitioning option
  JServer Release 9.2.0.4.0 - Production
  
  SQL> alter index SYS.I_OBJAUTH1 monitoring usage ;
  
  Index altered.
  
  SQL> shutdown immediate;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  SQL> startup
  ORACLE instance started.
  
  Total System Global Area 80811208 bytes
  Fixed Size 451784 bytes
  Variable Size 37748736 bytes
  Database Buffers 41943040 bytes
  Redo Buffers 667648 bytes
  Database mounted.
  
  此时,数据库挂起,而且不会有任何提示,在alert<sid>.log文件中,你可以看到:
  
  [oracle@jumper bdump]$ tail -f alert_conner.log Completed: ALTER DATABASE  MOUNTSat Dec 4 10:09:49 2004ALTER DATABASE OPENSat Dec 4 10:09:49 2004LGWR: Primary database is in CLUSTER CONSISTENT modeThread 1 opened at log sequence 54 Current log# 2 seq# 54 mem# 0: /opt/oracle/oradata/conner/redo02.logSuccessful open of redo thread 1.Sat Dec 4 10:09:49 2004SMON: enabling cache recoverySat Dec 4 10:10:33 2004Restarting dead background process QMN0QMN0 started with pid=9
  
  然后数据库将会停在此处。

  
  假如不知道此bug存在,你可能会一筹莫展的。
  
  现在你能做的就是从备份中恢复,或者升级到9.2.0.5。
  
  Oracle已经Release了这个Bug,你可以参考Metalink:Note:2934068.8,Oracle声明在9.2.0.5 (Server Patch Set)和 10g Production Base Release中fixed了这个Bug。
  
  [oracle@jumper oradata]$ rm -rf conner[oracle@jumper oradata]$ cp -R connerbak/ conner[oracle@jumper oradata]$ sqlplus '/ as sysdba'
  SQL*Plus: Release 9.2.0.4.0 - Production on Sat Dec 4 10:19:07 2004
  
  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
  
  Connected to an idle instance.
  
  SQL> startup
  ORACLE instance started.
  
  Total System Global Area 80811208 bytes
  Fixed Size 451784 bytes
  Variable Size 37748736 bytes
  Database Buffers 41943040 bytes
  Redo Buffers 667648 bytes
  Database mounted.
  Database opened.
  SQL>
  
  3. 在非凡的情况下,你可能需要清除这个v$object_usage视图中的信息.
  
  Oracle的说法是,在下一次收集该对象的索引使用情况时会自动覆盖上一次的信息,不提供清除手段.
  
  稍微研究了一下.
  
  v$object_usage是基于以下基表建立起来的:
  
  create or replace view v$object_usage(index_name, table_name, monitoring, used, start_monitoring, end_monitoring)asselect io.name, t.name,    decode(bitand(i.flags, 65536), 0, 'NO', 'YES'),    decode(bitand(ou.flags, 1), 0, 'NO', 'YES'),    ou.start_monitoring,    ou.end_monitoringfrom sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ouwhere io.owner# = userenv('SCHEMAID') and i.obj# = ou.obj# and io.obj# = ou.obj# and t.obj# = i.bo#/
  
  注重到v$object_usage要害信息来源于OBJECT_USAGE表.
  
  另外我们可以注重一下,此处v$object_usage的查询基于userenv('SCHEMAID')建立.
  
  所以以不同用户登录,你是无法看到其他用户的索引监视信息的,即使是dba,但是可以从object_usage表中得到.
  
  SQL> select * from v$object_usage;
  
  INDEX_NAME  TABLE_NAME MON USE START_MONITORING  END_MONITORING
  ------------ ------------ ------------------- -------------------
  PK_DEPT    DEPT    NO YES 10/28/2004 10:55:19 10/28/2004 10:55:47
  
  SQL> select * from object_usage;
  select * from object_usage
  *
  ERROR at line 1:
  ORA-00942: table or view does not exist
  
  
  SQL> connect /as sysdba
  Connected.
  SQL> /
  
  OBJ#   FLAGS START_MONITORING  END_MONITORING
  ---------- ---------- ------------------- -------------------
  6288     1 10/28/2004 10:55:19 10/28/2004 10:55:47
  
  实际上我们清除了object_usage表的记录,实际上也就清空了v$object_usage的信息.
  
  SQL> delete from object_usage;
  
  1 row deleted.
  
  SQL> commit;
  
  Commit complete.
  
  SQL> select * from v$object_usage;
  
  no rows selected
  
  此操作对数据库没有潜在的影响,但是请谨慎使用.作为实验目的提供.
上一篇:Oracle中实现数据迁移和数据共享 人气:838
下一篇:在Oracle中大数据量的导入和导出 人气:647
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐