高级DBA经常告诉刚刚入行的DBA,在Oracle6年代,他们曾经将每一张V$视图烂熟于心。在Oracle6中,仅仅只有23个V$视图,那时侯的DBA可以很轻松地使用它们。而在Oracle9i中,有259个V$视图以及近400个X$表;现在Oracle10gR2(10.2.0.1.0)有372个V$视图和613个X$表。几乎所有的出色调整或者DBA产品都有一个共性。它们中的大多数都是通过访问V$视图来获取从数据库、单个查询、或者单个用户检索出来的内部信息。通过JoeTrezzo和其他V$宗师们大量的介绍,访问V$视图已经变得越来越普遍。只有在看过V$视图之后,您才能体会之前的欠缺。V$视图可以全面、准确地展示Oracle数据库的核心信息。它是将普通水平的管理人员变为DBA专家的纽带。第13章将更全面地介绍X$表,该表是V$视图的底层部分。附录B和C提供了V$视图的相关信息,以及X$表的创建脚本。遗憾的是,由于篇幅所限,我不能展示每一个V$脚本,我也不想重复其他章节已经深入讨论过的内容。请查看我们的网站()来获得最新的可使用的V$脚本。本章主要内容:●创建V$视图并设置其访问权限●获得所有V$视图的列表●获得组成V$视图的X$脚本的列表●检查组成DBA_视图的底层对象●查询V$DATABASE,以获得数据库的创建时间和归档信息●了解自动工作量仓库(AutomaticWorkloadRepository,简称AWR)●查询V$LICENSE,以查看许可限制和警告设置●访问V$OPTIONS,以查看所有已经安装的选项●查询V$SGA来分配Oracle的基本内存●查询V$SGSSTAT来详细分配Oracle的内存●在V$PARAMETER中查找init.ora的设置●测定数据的命中率(V$SYSSTAT)●测定数据字典的命中率(V$ROWCACHE)●测定共享SQL和PL/SQL的命中率(V$LIBRARYCACHE)●识别哪个对象需要固定,以及是否有连续的空闲内存(V$DB_OBJECT_CACHE)●通过访问V$SQLAREA、V$SQLTEXT、V$SESSION以及V$SESS_IO来查找有问题的查询●检查用户的当前操作及其所使用的资源●识别锁定问题并关闭相应的会话●查找使用多会话的用户●使用视图V$DATAFILE、V$FILESTAT以及DBA_DATA_FILES来平衡I/O●检查确认是否有足够的空闲列表●检查角色和特权设置●使用V$SESSION、V$SESSION_WAIT、V$SESSION_EVENT、V$SESSION_WAIT_CLASS、V$SESSION_WAIT_HISTORY、V$SYSTEM_EVENT和V$SYSTEM_WAIT_CLASS查找等待●按所符合的类别使用表分组V$视图12.1V$视图的创建和访问V$视图是由catalog.sql脚本创建的。在Oracle10g中,有将近372个V$视图。实际的数量随版本和平台的不同而不同。下面是从Oracle6到Oracle10gR2V$视图和X$表的具体数目的变化:版本V$视图X$表623(?)7.172126(续表)版本V$视图X$表8.01322008.11852719.02273529.225939410.134054310.2372613创建时均以v_$作为这些视图的前缀。catldr.sql脚本创建了两张视图,用于SQL*Loader的直接加载的统计信息。每个V$视图的底层视图定义(从技术角度讲,这些视图从没有被创建,它们的定义只是以二进制形式硬编码)可以通过名为V$FIXED_VIEW_DEFINITION的V$视图查看。视图是通过选取一个或多个X$表中的信息来创建的。系统为每一个v_$视图创建了一个可以允许用户访问的视图。用户不能访问实际的v$视图(他们实际上是访问v_$视图;v$对象只对SYS用户可见),所以,该方法通过在一个视图上创建另一个视图的方法提供了对这些视图的访问。然后,视图的前缀改为了V$。最后,因为SYS用户拥有这些表,每个视图上就创建了一个公共同名视图。下面的程序清单展示了一个用catalog.sql创建V$视图的示例createorreplaceviewgv_$datafileasselect*fromgv$datafile;createorreplacepublicsynonymgv$datafileforgv_$datafile;下文详细描述了整个事件的完整步骤:(1)当创建数据库时,根据X$表创建GV$视图的定义:createorreplaceviewgv$fixed_tableasselectinst_id,kqftanam,kqftaobj,'TABLE',indxfromX$kqftaunionallselectinst_id,kqfvinam,kqfviobj,'VIEW',65537fromX$kqfviunionallselectinst_id,kqfdtnam,kqfdtobj,'TABLE',65537fromX$kqfdt;(2)执行版本特定的目录脚本:SQL@catalog(3)根据V$视图创建v_$视图:createorreplaceviewv_$fixed_tableasselect*fromv$fixed_table;(4)再根据v_$视图创建新的V$同名视图:createorreplacepublicsynonymv$fixed_tableforv_$fixed_table;技巧:SYSTEM访问的V$视图实际上是指向v_$视图的同名视图,而v_$视图是以根据X$表创建的原始V$视图为基础而建立的视图(最好将上面的话多读几遍)。这些视图上唯一可以执行的操作就是SELECT。为了用户能够访问V$视图,必须授于用户访问底层的v_$视图的权限。不能授于用户访问V$视图的权限(即使是SYS用户):connectsys/change_on_installassysdbaGrantselectonv$fixed_tabletorichn;ORA-02030:canonlyselectfromfixedtables/views.尽管在尝试授权访问V$FIXED_TABLE时返回的错误消息反映了不正确的信息(紧接前面的代码),但授权仍然无法实现。然而,可以授权访问V$视图底层的v_$视图。要与SYS超级用户连接,请使用下面的语句:Connectsys/change_on_installassysdbaConnected.要向指定用户授于访问底层视图的权限,请使用下列语句:grantselectonv_$fixed_tabletorichn;Grantsucceeded.要以指定的用户身份连接,请使用下列语句:connrichn/tuscConnected.使用下列的语句来访问V$FIXED_TABLE视图,它是根据V_$FIXED_TABLE创建的同名视图:selectcount(*)fromv$fixed_table;COUNT(*)--------1224尽管已经过授权,仍然不能访问v_$fixed_table:selectcount(*)fromv_$fixed_table;ORA-00942:tableorviewdoesnotexist.如果加上前缀SYS,就可以访问v_$fixed_table了:connrichn/tuscselectcount(*)fromSYS.v_$fixed_table;COUNT(*)--------1224为了避免混淆,最好是授于对v_$表的访问权限,并通知DBA用户可访问V$视图。通过这个方法,就可以授权他人访问V$视图的信息,而不用向他们提供SYS或者SYSTEM账户的密码。关键是对他SYS所有的原始v_$视图授予SELECT权限。技巧:当其他的DBA需要访问V$视图的信息,但是没有SYS或SYSTEM密码时,可以授予他们访问v_$视图的权限。然后这些用户就可以访问与v_$视图具有公共同名的V$视图。然而,所写的脚本必须直接查询SYS.V_$视图,以避免重引用公共同名视图造成的性能损失。警告:应该仅在需要的时候才授于非DBA用户访问V$视图的权限,并且要小心谨慎。记住,查询V$视图会造成性能损失,并且您的环境越复杂,这些损失就越多。12.1.1获得所有V$视图的数量和列表要获得某个版本的Oracle的所有V$视图的数量,可以查询V$FIXED_TABLE视图。即使是同一个版本,V$视图的数量也会变化。下面的示例显示了针对Oracle10g的V$视图查询。每一个新版本Oracle中的V$视图的数量一直在不断膨胀。下面程序清单展示了获得V$视图数量的查询:selectcount(*)fromv$fixed_tablewherenamelike'V%';COUNT(*)--------372许多V$视图仍然没有记入技术资料文档。随着视图数据的增长,在Oracle中探索数据的方法变得越来越多。在Oracle8中,引入了GV$视图。GV$视图(全局V$)与V$视图基本一样,只是附加了一个实例ID列。下面的程序清单给出了GV$视图的部分列表(仅是部分列表;完整的列表见附录B)。selectnamefromv$fixed_tablewherenamelike'GV%'orderbyname;NAME---------------------------------GV$ACCESSGV$ACTIVE_INSTANCESGV$ACTIVE_SERVICESGV$ACTIVE_SESSION_HISTORYGV$ACTIVE_SESS_POOL_MTHGV$ADVISOR_PROGRESSGV$ALERT_TYPESGV$AQ1GV$ARCHIVEGV$ARCHIVED_LOGGV$ARCHIVE_DESTGV$ARCHIVE_DEST_STATUSGV$ARCHIVE_GAPGV$ARCHIVE_PROCESSES...技巧:查询V$FIXED_TABLE视图可以获得数据库中所有的GV$视图和V$视图。GV$视图和V$视图几乎完全一样,但实例ID列包含了一个标识符。12.1.2查找用于创建V$视图的X$表为了理解V$视图的信息是从何处得到的,可以查询底层的X$表(查阅第13章了解更详细的信息)。有时候,查询底层的X$表可能更有利,因为V$视图通常根据多个X$表连接得到。X$表非常隐秘,因为它和Oracle数据字典的底层表结构很相似。Oracle在SGA中创建V$视图,使用户可以以一种更便于阅读的格式来检查X$表中存储的信息。实际上,当在V$视图上执行SELECT操作时,SELECT操作负责从SGA中提取信息——更明确地说,是从X$表中提取信息。在了解SELECT所操作的底层V$视图后,您就有能力创建自定义视图;直接复制Select语句底层的V$视图,然后修改或者创建一个针对X$表的新定制的SELECT语句。这个技术可创建出更具选择性和更加优化的查询。下面的程序清单用于访问对底层X$表的查询。为了获得组成V$视图的X$表的列表,必须访问V$FIXED_TABLE_DEFINITION视图(输出结果已经过格式设置,更便于阅读)。select*fromv$fixed_view_definitionwhereview_name='GV$FIXED_TABLE';输出结果VIEW_NAMEVIEW_DEFINITION--------------------------------------------------------------GV$FIXED_TABLEselectinst_id,kqftanam,kqftaobj,'TABLE',indxfromX$kqftaunionallselectinst_id,kqfvinam,kqfviobj,'VIEW',65537fromX$kqfviunionallselectinst