036.笔记:V$视图

【V$视图的创建和访问】V$视图是由catalog.sql脚本创建的。视图是通过选取一个或多个X$表中的信息来创建的。系统为每一个v_$视图创建了一个可以允许用户访问的视图。
用户不能访问实际的v$视图(他们实际上是访问v_$视图;v$对象只对sys用户可见),所以,该方法通过在一个视图上创建另一个视图的方法提供了对这些视图的访问。然后,
视图的前缀改为了v$。最后,因为SYS用户拥有这些表,每个视图上就创建了一个公共同名视图。
【技巧】SYSTEM访问的V$视图实际上是指向v_$视图的同名视图,而v_$视图是以根据X$表创建的原始V$视图为基础而建立的视图(最好将上面的话多读几遍)。
【技巧】当其他的DBA需要访问V$视图的信息,但是没有SYS或SYSTEM密码时,可以授予他们访问v_$视图的权限。然后这些用户就可以访问与v_$视图具有公共同名的V$视图。
然而,所写的脚本必须直接查询SYS.V_$视图,以避免重引用公共同名视图造成的性能损失。
【警告】应该仅在需要的时候才授予非DBA用户访问V$视图的权限,并且要小心谨慎。记住,查询V$视图会造成性能损失,并且您的环境越复杂,这些损失就越多。

1.获得所有V$视图的数量和列表
select * from v$fixed_table t where name like 'V%'
select * from v$fixed_table t where name like 'GV%'
select * from v$fixed_table t where NAME like 'X%';

2.查找用于创建V$视图的X$表
为了理解V$视图的信息是从何处得到的,可以查询底层的X$表。有时候,查询底层的X$表可能更有利,因为V$视图通常根据多个X$表连接得到。
在了解SELECT所操作的底层V$视图后,您就有能力创建自定义视图;直接复制select语句底层的V$视图,然后修改或者创建一个针对X$表的新定制的select语句。这个技术
可创建出更具选择性和更加优化的查询。
--访问V$FIXED_TABLE_DEFINITION
select * from v$fixed_view_definition where view_name='GV$FIXED_TABLE';
【技巧】访问V$FIXED_TABLE_DEFINITION视图可以获得组成V$视图的底层X$表的所有信息

同样需要注意的是,在Oracle 8中,底层的X$表存在索引,以使在V$视图上执行的查询可以更快地执行。可以通过V$INDEXED_FIXED_COLUMN视图来查看在底层X$表上的索引
信息。
select * from V$INDEXED_FIXED_COLUMN t

3.查找组成DBA_视图的底层对象
有些人认为DBA_视图也是从X$表和/或者V$视图得到的。它们实际上是从Oracle底层数据库的表中得到的(当然也有些是通过访问X$表得到的)。
【注意】可能需要将长度设置为2000000来查看所有的输出结果
set long 2000000;
select text from dba_views where view_name='DBA_IND_PARTITIONS';
SELECT * FROM DBA_VIEWS T WHERE T.VIEW_NAME LIKE 'DBA%';
【技巧】DBA_视图不是从X$表或者V$视图派生的。事实上,可以从obj$中删除行数据这一特性尽量不要以SYS超级用户的身份执行类似操作。

4.使用有帮助的V$脚本
4.1基本的数据库信息
select * from v$version;
select name,created,log_mode,T.FLASHBACK_ON from v$database T;
4.2自动工作量仓库(AWR)的基本信息
1)AWR使用多少空间?
select occupant_name,t.OCCUPANT_DESC,t.SPACE_USAGE_KBYTES
from v$sysaux_occupants t
where t.OCCUPANT_NAME like '%AWR%';
2)系统上最原始的AWR信息是什么?
select dbms_stats.get_stats_history_availability from dual;
3)什么是AWR信息的保留期?
select dbms_stats.get_stats_history_retention from dual;
4)将AWR信息的保留期更改为15天?
begin
dbms_stats.alter_stats_history_retention(15);
end;
【技巧】查询V$SYSAUX_OCCUPANTS以确保自动工作量仓库(AWR)没有占用过多空间。使用DBMS_STATS检查历史和保留。
4.3基本的许可信息
select * from v$license;
SESSIONS_MAX SESSIONS_WARNING SESSIONS_CURRENT SESSIONS_HIGHWATER USERS_MAX
------------ ---------------- ---------------- ------------------ ----------
110 100 4 5 80
会话警告级别为0表示没有设置init.ora会话警告参数,所以系统不会显示警告信息。会话最大级别为0表示没有设置init.ora最大参数,所以系统不会限制会话的数量。
--查看参数
select * from v$parameter t
where t.NAME like 'lice%';
--限制
alter system set license_max_sessions=110 scope=both;
alter system set license_sessions_warning=100 scope=both;
alter system set license_max_users=80 scope=both;
--去掉限制
alter system set license_max_sessions=0 scope=both;
alter system set license_sessions_warning=0 scope=both;
alter system set license_max_users=0 scope=both;
4.4数据库中已安装的产品项
select * from v$option;

5.内存分配摘要(V$SGA)
select * from v$sga;
sys用户使用show sga命令也可以显示该信息
select (
(select sum(value) from v$sga)-
(select current_size from v$sga_dynamic_free_memory)
) "sga_target"
from dual;

6.内存分配的细节(V$SGASTAT)
select * from v$sgastat;

select nvl(t.POOL,name) name ,ROUND(sum(t.BYTES )/1024/1024,2) MBYTES
from v$sgastat t
group by nvl(t.POOL,name)
order by 2 DESC;

7.在V$PARAMETER中发现init.ora的设置
select name,value,isdefault,isses_modifiable,issys_modifiable
from v$parameter
order by name;
【技巧】查询V$PARAMETER视图,将得到init.ora参数的当前值。它还显示了哪些init.ora参数已经改动了原始的默认值:isdefault=false。它还显示了对于一个给定的会话,
只能修改哪些参数(当isses_moodifiable=true时)。最后,它显示了在不用关闭和重启数据库可以修改哪些参数(当ISSYS_MODIFIABLE=IMMEDIATE时);而ISSYS_MODIFIABLE=DEFERRED
说明该参数对所有新登录的,但当前未登录会话的用户有效。如果参数ISSYS_MODIFIABLE=FALSE,则说明该实例必须关闭并重启,才能使设置生效。

8.测定数据的命中率(V$SYSSTAT)
--数据命中率
select 1-(sum(decode(name,'physical reads',value,0))
/(sum(decode(name,'db block gets',value,0))+sum(decode(name,'consistent gets',value,0)) )
)
from v$sysstat;
--在Oracle 10g中,也可以直接获得v$sysmetric中的AWR信息
select * from v$sysmetric t
where t.METRIC_NAME='Buffer Cache Hit Ratio';

很高的命中率,并不意味着系统已经调整至最佳状态。很高的命中率也可能意味着查询使用了过度的索引。如果这个命中率低于95%,您可能需要增加DB_CACHE_SIZE,
或者调整一些引起磁盘读取操作的查询(仅当这样做是可行的并且确实有效的情况下)。一种例外情况就是分布在不同块中的数据分布的极不平衡。如果不考虑这种可能
性,那么命中率低于90%几乎总意味着系统调整得很糟糕,要么就是某些人不切实际地设计,使每个数据块的数据都极不平衡。
如果需要,也可以使用新的V$DB_CACHE_ADVICE视图来帮助改变数据缓存的大小。
select * from v$db_cache_advice t;

--内存排序比例
select * from v$sysmetric t
where t.METRIC_NAME='Memory Sorts Ratio';

9.测定数据字典的命中率(V$ROWCACHE)
select sum(t.GETS),sum(t.GETMISSES),(1 - ( sum(t.GETMISSES)/( sum(t.GETS) + sum(t.GETMISSES) ) )) from v$rowcache t;
推荐的命中率是95%或者更高。
注意:在大幅度使用公共同名的环境中,字典命中率可能难以超过75%,即使共享池的尺寸很大。这是因为Oracle必须经常检查不存在的对象是否依旧存在。

10.测定共享SQL和PL/SQL的命中率(V$LIBRARYCACHE)
SELECT * FROM V$LIBRARYCACHE T;
--查询v$librarycache,看看是否重用SQL
SELECT SUM(pins) "Execution" ,sum(t.PINHITS) "Hits",
((sum(t.PINHITS)/sum(pins))*100) "PinHitRatio",
sum(t.RELOADS) "Misses",((sum(t.PINS)/ (sum(t.PINS)+sum(t.RELOADS)))*100) "RelHitRatio"
FROM V$LIBRARYCACHE T;

--查询v$sql_bind_capture:
SELECT t.SQL_ID,count(*) bind_count
FROM V$SQL_BIND_CAPTURE t
where t.CHILD_NUMBER=0
group by t.SQL_ID
having count(*)>20
order by count(*);

SQL_ID BIND_COUNT
------------- ----------
9qgtwh66xg6nz 21
c0agatqzq2jzr 25
19rkm1wsf9axx 29

--查找有问题的SQL并修复它:
select t.SQL_TEXT,t.USERS_EXECUTING,t.EXECUTIONS,t.USERS_OPENING,t.BUFFER_GETS
from v$sqlarea t
where t.SQL_ID='19rkm1wsf9axx';

--查询v$sql_bind_capture,看看average binds是否大于15(isuse):
select avg(bind_count) avg_num_binds
from
(
select sql_id,count(*) bind_count
from v$sql_bind_capture t
where t.CHILD_NUMBER=0
group by t.SQL_ID
);
【技巧】查询V$LIBRARYCACHE视图可以知道从内存中访问SQL和PL/SQL的频率的信息。固定命中率通常应该是95%或更高,而重载的次数不应该超过1%。
查询V$SQL_BIND_CAPTURE视图,看看每个SQL绑定是否太高,是否需要CURSOR_SHARING。

11.确定需要固定的PL/SQL对象
select *
from v$db_object_cache t
where t.SHARABLE_MEM>100000
AND T.TYPE IN('FUNCTION','PACKAGE BODY','PACKAGE','PROCEDURE')
and t.KEPT='NO';

12.通过V$SQLAREA查找有问题的查询
--disk_reads可以用buffer_gets列来代替
select u.username,t.DISK_READS,t.EXECUTIONS,t.DISK_READS/ decode(t.EXECUTIONS,0,1,t.EXECUTIONS) rds_exec_tatio,
t.COMMAND_TYPE,t.SQL_TEXT
from v$sqlarea t
inner join dba_users u on(u.user_id=t.PARSING_USER_ID)
where t.DISK_READS>100
order by t.DISK_READS desc;

13.检查用户的当前操作及其使用的资源
--用sys为当前用户赋对象权限v_$session、v_$sqltext
--当前的操作
select s.SID,s.USERNAME,t.SQL_TEXT,t.PIECE
from v$session s
inner join v$sqltext t on(t.ADDRESS=s.SQL_ADDRESS and s.SQL_HASH_VALUE=t.HASH_VALUE)
order by s.USERNAME,s.SID,t.PIECE;
--使用的资源
select a.USERNAME,b.BLOCK_GETS,b.CONSISTENT_GETS,b.PHYSICAL_READS,b.BLOCK_CHANGES,b.CONSISTENT_CHANGES
from v$session a
inner join v$sess_io b on(b.SID=a.SID)
--where a.USERNAME is not null--v$session中username为null的是后台进程
order by a.USERNAME;
【技巧】通过查询V$SESSION、V$SQLTEXT和V$SESS_IO可发现有问题的用户,并可发现一个给定的时间点上他们在执行什么操作。

14.查找用户正在访问的对象
select a.SID,a.USERNAME,b.OWNER,b.OBJECT,b.TYPE
from v$session a
inner join v$access b on(b.SID=a.SID)
--where a.USERNAME is not null--v$session中username为null的是后台进程
【技巧】通过查询V$ACCESS视图可查看在给定的时间点上用户所访问的所有对象。这有助于查明有问题的对象,在想修改一个特定的对象时也很有用(查找谁在访问它)。
然而,当系统有一个很大的共享池和数百个用户时,这个操作的开销将很大。

【获得详细的用户信息】
select a.USERNAME,c.NAME,sum(b.VALUE) value
from v$session a
inner join v$sesstat b on(a.SID=b.SID and b.VALUE!=0)
inner join v$statname c on(c.STATISTIC#=b.STATISTIC#)
--where a.USERNAME is not null
group by c.name,a.USERNAME

15.使用索引
Oracle 9i提供了监控索引使用的功能。这个新的视图表示索引是否被引用,但不能反映索引使用的频率。要监控的索引需要单独打开和关闭。可以使用alter index命令
来初始化监控工作,然后通过对视图V$OBJECT_USAGE的查询来实现索引的跟踪。
--在监控任何索引前,这个视图没有任何记录:
select * from v$object_usage;
--开始监控索引
select * from v$object_usage;--当前模式下的索引监控
ALTER index scott.INDEX_EMP2 monitoring usage;
ALTER index scott.IDEX_DE2 monitoring usage;
select /*+index(t,INDEX_EMP2)*/* from scott.emp t where t.empno=7369;
--结束监控
ALTER index scott.INDEX_EMP2 nomonitoring usage;
select * from v$object_usage;--当前模式下的索引监控
【技巧】使用V$OBJECT_USAGE视图来查看索引是否已被使用。也许某些索引是不需要的。

16.确定锁定问题
【模拟锁定】
1)会话1
select * from emp for update;
2)会话2
update emp set ename=ename||'a' where empno=7369;
3)查看锁定
select /*+ordered*/
b.USERNAME,b.SERIAL#,d.ID1,d.TYPE,a.SQL_TEXT
from v$lock d
inner join v$session b on(b.LOCKWAIT=d.KADDR)
inner join v$sqltext a on(a.ADDRESS=b.SQL_ADDRESS and a.HASH_VALUE=b.SQL_HASH_VALUE);

---------------------------------------------------------------------------------------
USERNAME SERIAL# ID1 TYPE SQL_TEXT
1 SCOTT 197 1048611 TX update emp set ename=ename||'a' where empno=7369
---------------------------------------------------------------------------------------
【附】TM锁、TX锁
基本的锁类型:排它锁(EXCLUSIVE LOCKS,即X锁)和共享锁(share locks,即S锁)
oracle数据库锁可以分为以下几大类:
1)锁DML(data locks,数据锁),用于保护数据的完整性;
2)DDL锁(DICTIONARY lock,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
3)内部锁和闩(internal locks and latches),保护数据库的内部结构。
在oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁

4)查看锁定(下面的语句修改过,与书上不一样。书上的SQL执行结果是空的)
--查看锁定
select /*+ ordered */a.SID,a.SERIAL#,a.USERNAME,b.ID1,c.SQL_TEXT
from v$lock b
inner join v$session a on(a.SID=b.SID)
inner join v$sqltext c on(c.HASH_VALUE=a.SQL_HASH_VALUE);
--查看有问题的会话
select t.USERNAME,t.SERIAL#,t.COMMAND,t.SID,t.BLOCKING_SESSION,t.BLOCKING_SESSION_STATUS,t.SECONDS_IN_WAIT
from v$session t
where t.BLOCKING_SESSION is not null or sid in
(select BLOCKING_SESSION from v$session where BLOCKING_SESSION is not null )
ORDER BY t.BLOCKING_SESSION;

【附】v$session.lockwait:LOCKWAIT VARCHAR2(8) Address of lock waiting for; null if none
v$session.BLOCKING_SESSION NUMBER Session identifier of blocking session
5)其他查看锁定的代码
--4位用户更新相同代码块中的不同行
select /*+ordered*/ b.USERNAME,a.SID,trunc(a.ID1/power(2,16)) rbs,
bitand(id1,to_number('ffff','xxxx'))+0 slot,
id2 seq,a.LMODE,a.REQUEST
from v$lock a,v$session b
where a.TYPE='TX' AND a.SID=b.SID;

select t.XID,t.XIDUSN,t.XIDSLOT,t.XIDSQN,t.STATUS,t.START_SCN
from v$transaction t
order by t.start_scn;

--查看BLOCKING_SESSION
select t.SID,t.BLOCKING_SESSION,t.USERNAME,t.BLOCKING_SESSION_STATUS
from v$session t
where t.USERNAME='SCOTT'
ORDER BY t.BLOCKING_SESSION;

select a.SID,a.SERIAL#,a.USERNAME,a.LOCKWAIT,a.BLOCKING_SESSION ,b.SQL_TEXT
from v$session a
left join v$sqltext b on(b.SQL_ID=a.SQL_ID and b.HASH_VALUE=a.SQL_HASH_VALUE);

select t.SECONDS_IN_WAIT,t.*
from v$session t
where t.USERNAME is not null and t.COMMAND=0
order by t.SECONDS_IN_WAIT desc;

【附】Table 5-5 COMMAND Column of V$SESSION and Corresponding Commands

Number Command Number Command
1 CREATE TABLE 2 INSERT
3 SELECT 4 CREATE CLUSTER
5 ALTER CLUSTER 6 UPDATE
7 DELETE 8 DROP CLUSTER
9 CREATE INDEX 10 DROP INDEX
11 ALTER INDEX 12 DROP TABLE
13 CREATE SEQUENCE 14 ALTER SEQUENCE
15 ALTER TABLE 16 DROP SEQUENCE
17 GRANT OBJECT 18 REVOKE OBJECT
19 CREATE SYNONYM 20 DROP SYNONYM
21 CREATE VIEW 22 DROP VIEW
23 VALIDATE INDEX 24 CREATE PROCEDURE
25 ALTER PROCEDURE 26 LOCK
27 NO-OP 28 RENAME
29 COMMENT 30 AUDIT OBJECT
31 NOAUDIT OBJECT 32 CREATE DATABASE LINK
33 DROP DATABASE LINK 34 CREATE DATABASE
35 ALTER DATABASE 36 CREATE ROLLBACK SEG
37 ALTER ROLLBACK SEG 38 DROP ROLLBACK SEG
39 CREATE TABLESPACE 40 ALTER TABLESPACE
41 DROP TABLESPACE 42 ALTER SESSION
43 ALTER USER 44 COMMIT
45 ROLLBACK 46 SAVEPOINT
47 PL/SQL EXECUTE 48 SET TRANSACTION
49 ALTER SYSTEM 50 EXPLAIN
51 CREATE USER 52 CREATE ROLE
53 DROP USER 54 DROP ROLE
55 SET ROLE 56 CREATE SCHEMA
57 CREATE CONTROL FILE 59 CREATE TRIGGER
60 ALTER TRIGGER 61 DROP TRIGGER
62 ANALYZE TABLE 63 ANALYZE INDEX
64 ANALYZE CLUSTER 65 CREATE PROFILE
66 DROP PROFILE 67 ALTER PROFILE
68 DROP PROCEDURE 70 ALTER RESOURCE COST
71 CREATE MATERIALIZED VIEW LOG 72 ALTER MATERIALIZED VIEW LOG
73 DROP MATERIALIZED VIEW LOG 74 CREATE MATERIALIZED VIEW
75 ALTER MATERIALIZED VIEW 76 DROP MATERIALIZED VIEW
77 CREATE TYPE 78 DROP TYPE
79 ALTER ROLE 80 ALTER TYPE
81 CREATE TYPE BODY 82 ALTER TYPE BODY
83 DROP TYPE BODY 84 DROP LIBRARY
85 TRUNCATE TABLE 86 TRUNCATE CLUSTER
91 CREATE FUNCTION 92 ALTER FUNCTION
93 DROP FUNCTION 94 CREATE PACKAGE
95 ALTER PACKAGE 96 DROP PACKAGE
97 CREATE PACKAGE BODY 98 ALTER PACKAGE BODY
99 DROP PACKAGE BODY 100 LOGON
101 LOGOFF 102 LOGOFF BY CLEANUP
103 SESSION REC 104 SYSTEM AUDIT
105 SYSTEM NOAUDIT 106 AUDIT DEFAULT
107 NOAUDIT DEFAULT 108 SYSTEM GRANT
109 SYSTEM REVOKE 110 CREATE PUBLIC SYNONYM
111 DROP PUBLIC SYNONYM 112 CREATE PUBLIC DATABASE LINK
113 DROP PUBLIC DATABASE LINK 114 GRANT ROLE
115 REVOKE ROLE 116 EXECUTE PROCEDURE
117 USER COMMENT 118 ENABLE TRIGGER
119 DISABLE TRIGGER 120 ENABLE ALL TRIGGERS
121 DISABLE ALL TRIGGERS 122 NETWORK ERROR
123 EXECUTE TYPE 157 CREATE DIRECTORY
158 DROP DIRECTORY 159 CREATE LIBRARY
160 CREATE JAVA 161 ALTER JAVA
162 DROP JAVA 163 CREATE OPERATOR
164 CREATE INDEXTYPE 165 DROP INDEXTYPE
167 DROP OPERATOR 168 ASSOCIATE STATISTICS
169 DISASSOCIATE STATISTICS 170 CALL METHOD
171 CREATE SUMMARY 172 ALTER SUMMARY
173 DROP SUMMARY 174 CREATE DIMENSION
175 ALTER DIMENSION 176 DROP DIMENSION
177 CREATE CONTEXT 178 DROP CONTEXT
179 ALTER OUTLINE 180 CREATE OUTLINE
181 DROP OUTLINE 182 UPDATE INDEXES
183 ALTER OPERATOR
【如何判断“未COMMIT的事务”阻塞会话】
select t.USERNAME,t.SERIAL#,t.COMMAND,t.SID,t.BLOCKING_SESSION,t.BLOCKING_SESSION_STATUS,t.SECONDS_IN_WAIT
from v$session t
where t.BLOCKING_SESSION is not null or sid in
(select BLOCKING_SESSION from v$session where BLOCKING_SESSION is not null )
ORDER BY t.BLOCKING_SESSION;

USERNAME SERIAL# COMMAND SID BLOCKING_SESSION BLOCKING_SESSION_STATUS SECONDS_IN_WAIT
SCOTT 14 6 80 78 VALID 975
SCOTT 7 6 84 78 VALID 972
SCOTT 31 3 86 NO HOLDER 3122
SCOTT 68 0 78 NO HOLDER 939
SCOTT 14 3 77 NO HOLDER 4350
【分析】会话78阻塞了会话80、84。
会话78的command是0,当前没有执行命令,而SECONDS_IN_WAIT是939秒,说明这是一个没有commit的会话。
【附】会话阻塞的影响
在OLTP系统,对访问频繁的表做DML后,如果没有COMMIT,会导致系统进程数激增。网上说还会导致CPU使用率100%,sqlplus无法登录。
有人建议打开附加日志功能,以便发生问题后找到问题根源。
我认为无论什么导致CPU使用率达到100%,dba不能登录SQLPLUS进行维护都是不应该发生的。为了避免这个问题,应该启用资源计划(或配置文件),为DBA角色预留系统资源。

17.关闭有问题的会话
--查找有问题会话
select t.USERNAME,t.SERIAL#,t.COMMAND,t.SID,t.BLOCKING_SESSION,t.BLOCKING_SESSION_STATUS,t.SECONDS_IN_WAIT
from v$session t
where t.BLOCKING_SESSION is not null or sid in
(select BLOCKING_SESSION from v$session where BLOCKING_SESSION is not null )
ORDER BY t.BLOCKING_SESSION;
--生成kill语句
select 'alter system kill session ''' ||sid||','||serial#||''';'
from v$session t
where sid in
(select BLOCKING_SESSION from v$session where BLOCKING_SESSION is not null )
ORDER BY t.BLOCKING_SESSION;
--kill语句
alter system kill session 'sid,serial#';

18.查找使用多会话的用户
select t.USERNAME,count(*)
from v$session t
group by t.USERNAME;
在某些O/S平台上,如果一个用户开始了一个会话,然后重启PC,通常当用户再次启动另一个会话时,原有的进程仍将在后台运行。
【注意】V$SESSION视图中用户名NULL的行是Oracle的后台进程。
【技巧】确定使用了多会话的用户,并判定是一个管理问题(用户使用了多终端)还是一个系统问题(会话没有被清除,或者产生了多余的进程)。

查询当前的配置文件:
select * from dba_profiles;

19.查找磁盘I/O问题
视图V$DATAFILE、V$FILESTAT和V$DBA_FILES提供了数据库中所有数据文件和磁盘的文件I/O活动信息。理想情况下,物理的读和写应当平均分布。
select t.FILE#,t.NAME,t.STATUS,t.BYTES,f.PHYRDS,f.PHYWRTS
from v$datafile t
inner join v$filestat f on(f.FILE#=t.FILE#) ;

【附】V$FILESTAT
Column Datatype Description
FILE# NUMBER Number of the file
PHYRDS NUMBER Number of physical reads done
PHYWRTS NUMBER Number of times DBWR is required to write
PHYBLKRD NUMBER Number of physical blocks read
PHYBLKWRT NUMBER Number of blocks written to disk, which may be the same as PHYWRTS if all writes are single blocks
SINGLEBLKRDS NUMBER Number of single block reads
READTIM NUMBER Time (in hundredths of a second) spent doing reads if the TIMED_STATISTICS parameter is true; 0 if false
WRITETIM NUMBER Time (in hundredths of a second) spent doing writes if the TIMED_STATISTICS parameter is true; 0 if false
SINGLEBLKRDTIM NUMBER Cumulative single block read time (in hundredths of a second)
AVGIOTIM NUMBER Average time (in hundredths of a second) spent on I/O, if the TIMED_STATISTICS parameter is true; 0 if false
LSTIOTIM NUMBER Time (in hundredths of a second) spent doing the last I/O, if the TIMED_STATISTICS parameter is true; 0 if false
MINIOTIM NUMBER Minimum time (in hundredths of a second) spent on a single I/O, if the TIMED_STATISTICS parameter is true; 0 if false
MAXIORTM NUMBER Maximum time (in hundredths of a second) spent doing a single read, if the TIMED_STATISTICS parameter is true; 0 if false
MAXIOWTM NUMBER Maximum time (in hundredths of a second) spent doing a single write, if the TIMED_STATISTICS parameter is true; 0 if false


--文件I/O情况
select c.TABLESPACE_NAME,b.NAME,B.BLOCKS,a.PHYBLKRD+a.PHYBLKWRT total,a.PHYBLKRD,A.PHYBLKWRT,a.PHYRDS,a.PHYWRTS
from v$filestat a
inner join v$datafile b on (b.FILE#=a.FILE#)
inner join dba_data_files c on (c.FILE_ID=b.FILE#);

select t.OBJECT_NAME,t.STATISTIC_NAME,t.VALUE
from v$segment_statistics t
where t.VALUE>100000
order by t.VALUE;

--磁盘I/O
select substr(b.NAME,1,13) disk,c.TABLESPACE_NAME,
a.PHYBLKRD+a.PHYBLKWRT Total,a.PHYRDS,a.PHYWRTS,
a.PHYBLKRD,a.PHYBLKWRT,
((a.READTIM/ decode(a.PHYRDS,0,1,a.PHYBLKRD))/100) avg_rd_time,
((a.WRITETIM/ decode(a.PHYWRTS,0,1,a.PHYBLKWRT))/100) avg_wrt_time
from v$filestat a
inner join v$datafile b on(b.FILE#=a.FILE#)
inner join dba_data_files c on(c.FILE_ID=b.FILE#)
【技巧】视图V$DATAFILE、V$FILESTAT和V$DBA_DATA_FILES提供了数据库中所有数据文件和磁盘的文件I/O活动信息。确保数据文件和磁盘都处于合理的平衡中,以获得最佳的性能。

20.查找回滚段的内容
select a.name,b.EXTENTS,b.RSSIZE,b.XACTS,b.WAITS,b.GETS,b.OPTSIZE,b.STATUS
from v$rollname a
inner join v$rollstat b on(b.USN=a.usn);
【技巧】查询V$ROLLNAME、V$ROLLSTAT和V$TRANSACTION视图可以提供用户如何使用回滚段和撤消表空间的信息。通常情况下,在一个时间点上不应该让多个用户访问
同一个回滚段(尽管这是被允许的)。
【注意】如果使用自动撤消管理,通常就不需要前一个查询。

--整个系统在整体上的等待数
select t.EVENT,t.TOTAL_WAITS,t.TOTAL_TIMEOUTS,(t.TIME_WAITED/100) tot_time,(t.AVERAGE_WAIT/100) avg_time
from v$system_event t
order by t.TOTAL_WAITS desc;

21.检查空闲列表是否充足
如果使用多进程完成大量的插入操作,空闲列表(空闲的数据库数据块的列表)的默认值1可能是不够的。如果没有使用自动空间段管理(Automatic Space Segment Management,
简称ASSM),您可能需要增加空闲列表,或者空闲列表组。
select ((a.COUNT/(b.VALUE+c.VALUE))*100) pct
from v$waitstat a
inner join v$sysstat b on(b.STATISTIC# = (select statistic# from v$statname where name='db block gets') )
inner join v$sysstat c on(c.STATISTIC# = (select statistic# from v$statname where name='consistent gets') )
where a.CLASS='free list';
如果活动比率超过1%,就需要增加空闲列表组了。
【技巧】在使用多进程完成大量的插入操作时,应确保有足够的空闲列表和空闲列表组。空闲列表的默认存储值是1.如果您使用了ASSM,Oracle将为您管理这些参数,但是
一个有大量数据交换的事务环境中,在应用ASSM前应经过仔细的测试。虽然如此,但通常最好使用ASSM。

22.检查角色和权限设置
--根据用户名进行授权的对象级特权
select b.owner||'.'||b.table_name obj,
b.privilege what_granted,b.grantable,
a.username
from dba_users a
inner join dba_tab_privs b on(b.grantee=a.username);

select b.owner||'.'||b.table_name obj,
b.privilege what_granted,b.grantable,
a.username
from dba_users a
inner join dba_tab_privs b on(b.grantee=a.username)
where a.username='SCOTT';

--根据被授权人进行授权的对象级特权
select t.owner||'.'||t.table_name obj,
t.privilege what_granted,t.grantable,t.grantee
from dba_tab_privs t
where not exists
(select 'x'
from dba_users u
where u.username=t.grantee)
order by 1,2,3;

--根据用户名进行授予的系统级特权
select b.privilege what_granted,b.ADMIN_OPTION,
a.username
from dba_users a
inner join dba_sys_privs b on(b.grantee=a.username);

select b.privilege what_granted,b.ADMIN_OPTION,
a.username
from dba_users a
inner join dba_sys_privs b on(b.grantee=a.username)
where a.username='SCOTT';

--根据被授权人进行授予的系统级特权
select t.privilege what_granted,t.ADMIN_OPTION,t.grantee
from dba_sys_privs t
where not exists
(select 'x'
from dba_users u
where u.username=t.grantee)
order by 1,2,3;

--根据用户名授予的角色
select b.GRANTED_ROLE||decode(b.ADMIN_OPTION,'YES','(With Admin Option)',null) what_granted,a.username
from dba_users a
inner join dba_role_privs b on(b.GRANTEE=a.username)
order by 1;

select b.GRANTED_ROLE||decode(b.ADMIN_OPTION,'YES','(With Admin Option)',null) what_granted,a.username
from dba_users a
inner join dba_role_privs b on(b.GRANTEE=a.username)
where a.username='SCOTT'
order by 1;

--根据被授权人授予的角色
select b.GRANTED_ROLE||decode(b.ADMIN_OPTION,'YES','(With Admin Option)',null) what_granted,b.GRANTEE
from dba_role_privs b
where not exists
(select 'x'
from dba_users a
where a.username=b.GRANTEE
)
order by 1;

--用户名及以被授予的相应权限
select *
from (
select a.username,b.GRANTED_ROLE||decode(b.ADMIN_OPTION,'YES','(With Admin Option)',null) what_granted
from dba_users a
inner join dba_role_privs b on(b.GRANTEE=a.username)--角色
union
select a.username,
b.privilege||decode(b.ADMIN_OPTION,'YES','(With Admin Option)',null) what_granted
from dba_users a
inner join dba_sys_privs b on(b.GRANTEE=a.username)--系统级特权
union
select a.username,
b.table_name||'-'||b.privilege||decode(b.GRANTable,'YES','(With Admin Option)',null) what_granted
from dba_users a
inner join dba_tab_privs b on(b.GRANTEE=a.username)--对象权限
order by 1
) where username='SCOTT'
【技巧】记录系统中已有的特权,这样您就可以应对各种类型的安全场景。
--查询用户名及相应的配置文件、默认的表空间和临时表空间
select t.username,t.profile,t.default_tablespace,t.temporary_tablespace,t.created
from dba_users t
order by username
23.等待事件V$视图
本节包含一些显示等待事件的V$脚本。从个人角度来说,RICH更喜欢使用STATSPACK报表、AWR报表或企业管理器来查找等待事件。
Oracle 10gR2中添加了一些新的视图,但最幸运的是在V$SESSION_WAIT中找到的东西现在在V$SESSION中可以找到。
--马上该谁等待--查询V$SESSION_WAIT/V$SESSION
select t.EVENT,sum(decode(t.WAIT_TIME,0,1,0)) "Waiting Now",
sum(decode(wait_time,0,0,1)) "Previous Waits",
count(*) "Total"
from v$session_wait t
group by t.EVENT
order by count(*);

wait_time=0 means that it is waiting
wait_time>0 means that it previously waited this many ms

select t.EVENT,sum(decode(t.WAIT_TIME,0,1,0)) "Waiting Now",
sum(decode(wait_time,0,0,1)) "Previous Waits",
count(*) "Total"
from v$session t
group by t.EVENT
order by count(*);

--马上该谁等待;specific Waits----查询v$session_wait
select /*+ordered*/sid,event,owner,segment_name,segment_type,p1,p2,p3
from v$session_wait sw
inner join dba_extents de on(de.FILE_ID=sw.P1 and sw.P2 between de.BLOCK_ID and de.BLOCK_ID+de.BLOCKS -1 )
where sw.P1 is not null and (event ='buffer busy waits' or event ='write complete waits');

--谁在等待-最后10个等待数----查询V$SESSION_WAIT_HISTORY
select /*+ordered*/sid,event,owner,segment_name,segment_type,p1,p2,p3
from V$session_Wait_History sw
inner join dba_extents de on(de.FILE_ID=sw.P1 and sw.P2 between de.BLOCK_ID and de.BLOCK_ID+de.BLOCKS -1 )
where sw.P1 is not null and (event ='buffer busy waits' or event ='write complete waits')

--查找P1、P2、P3代表什么--查询V$EVENT_NAME
select t.EVENT#,t.NAME,t.PARAMETER1 p1,t.PARAMETER2 p2,t.PARAMETER3 p3
from v$event_name t
where t.NAME in('buffer busy waits','write complete waits');

--会话开始后的所有等待数--查询V$SESSION_EVENT
select t.SID,t.EVENT,t.TOTAL_WAITS,t.TIME_WAITED,t.EVENT_ID
from v$session_event t
where t.TIME_WAITED>0
order by t.TIME_WAITED desc;

--类的所有会话等待数--查询V$SESSION_WAIT_CLASS
select t.SID,t.WAIT_CLASS,t.TOTAL_WAITS
from v$session_wait_class t;

--系统启动后的所有等待数--查询V$SYSTEM_EVENT
SELECT t.EVENT,t.TOTAL_WAITS,t.TIME_WAITED,t.EVENT_ID
FROM v$system_event t
where t.TIME_WAITED>0
order by t.TIME_WAITED;

--类的系统等待数--查询V$SYSTEM_WAIT_CLASS
select t.WAIT_CLASS,t.TOTAL_WAITS
from v$system_wait_class t
order by t.TOTAL_WAITS desc;

--类的系统等待数--查询V$ACTIVE_SESSION_HISTORY
SELECT t.SESSION_ID,count(1)
from v$active_session_history t
group by t.SESSION_ID
order by 2;

with t1 as(
SELECT t.SQL_ID,count(1)
from v$active_session_history t
where t.SQL_ID is not null
group by t.SQL_ID
order by 2
)
select t1.sql_id,a.SQL_TEXT
from v$sql a
inner join t1 on(a.SQL_ID=t1.sql_id)
where rownum<=5
order by rownum
【技巧】在Oracle 10g中V$SESSION_WAIT中的所有等待事件列现在都在V$SESSION中。因此,确保查询等待信息的V$SESSION,因为它是一个更快的视图。
V$ACTIVE_SESSION_HISTORY(ASH)将许多重要统计数据合并为一个视图或一个报表(ASH报表)。

24.一些主的的V$视图种类
书中将V$视图进行了分类
【注意】V$ROLLNAME视图的创建和其他V$视图有一些细微差别。V$ROLLNAME视图是X$表和UNDO$表连接的结果。某些V$timing字段的值依赖于init.ora的TIMED_STATISTICS
参数是否被设置为TRUE;如果该参数不是TRUE,则这些域将没有计时信息。



[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7901922/viewspace-1060019/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7901922/viewspace-1060019/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值