本文章为网络笔记,看了warehouse老师的视频受益匪浅,更是感觉自己技术太过初级,特写了本笔记,方便以后反复学习!
如有任何不妥,请发邮件至102448567@qq.com删除文章!
关于warehouse:
http://blog.itpub.net/19602/viewspace-1059211/
11gR2视频第四版 7_07_AWR
awr:auto workload repository
v$sysstat
v$system_event
统计信息也好,等待事件也好,这些东西都是在内存中的自实例起来之后就是累积的,一旦机器有问题重启了,那么这些信息都没有了,Oracle
从9i
开始定期往磁盘中写,在数据库中保留一段时间原来都在内存中,现在定期往磁盘上写,多长时间写一次、保留多长时间都是可以设置的,9i
的时候把这种思想叫做statspack
他只有text
格式,10g
叫AWR
,awr
的repository
Oracle
提供了表,这些表属于sys
但是放在sysaux
表空间中
10g
有三类表awr
表
11g
有四类表awr
表
命名很有特点,这些都是table
wri(internal)
wrm(metadata)
wrh(history)
11g
新增了
wrr$(replay)重演
引入了一个后台进程默认每隔一小时把统计信息从内存中往磁盘中写(做快照),AWR
就是取任何两次快照(只要这个instance
没有重启过)时间点之间,然后生成报告来判断有什么变化
SELECT *FROM v$bgprocessWHERE paddr <> '00';
40
号进程辅助39
号进程,只要是39
号进程每隔一小时把统计信息做一个快照然后写到磁盘上
wri、wrm、wrh、wrr
这四类都是基础表,一般从dba_hist
开头的视图中查询
dba_hist_wr_control
下面是关于dba_hist_wr_control
的定义,来源正是WRM$
这类基础表
DBID
就是v$database
中的ID
,默认是每一个小时(SNAP_INTERVAL)
做一个快照,保留8
天(RETENTION)
AWR
这些功能Oracle
都是调用的一个包
通过上图的包中的存储过程modify_snapshot_settings
就可以更改多久打一次快照和保留多长时间
SQL> exec dbms_workload_repository.modify_snapshot_settings(retention=>14400,interval=>30);PL/SQL procedure successfully completed.
已经更改了
下图记录的就是Oracle
打的快照,一次快照记录了一批统计信息,统计信息又包含了一批数据
比如说跟文件相关的统计信息就记录到了下面的这个视图中,当快照id
是16222
的时候,记录了8
个数据文件的信息,物理读了多少次,物理写了多少次,读的耗时,写的耗时等等
手动创建快照
现在最大是97
号快照
SELECT *FROM dba_hist_snapshotORDER BY snap_id DESC
手动创建
SQL> exec dbms_workload_repository.create_snapshot;PL/SQL procedure successfully completed.
现在变成了98
SELECT *FROM dba_hist_snapshotORDER BY snap_id DESC
生成AWR
脚本的路径$ORACLE_HOME/rdbms/admin/awrrpt.sql
,这个目录下有很多AWR
开头的脚本,这些都是awrrpt.sql
调用的,所以只要记住awrrpt.sql
就可以了
9i
的statspack
和AWR
最大的区别就是DB TIME
说明DB TIME
的实验:
session1
SQL> select *from tt;ID NAME AGE
---------- -------------------- ----------1 aaa 202 bbb 203 ccc 204 d 205 e 20SQL> update tt set name = 'a' where id = 1;1 row updated.
session2
SQL> conn xiha/xiha
Connected.
SQL> update tt set age = 30 where id = 1;
一直在等待
10
号session
被阻塞了
是被138
号session
阻塞的
SELECT *FROM v$sessionWHERE sid in (10,138)
v$sql
中可以看到执行sql
消耗的CPU
时间(CPU TIME
)和执行时间(elapsed_time
)单位是微秒(一秒的一百万分之一)
SELECT *FROM v$sqlWHERE sql_text like 'update tt set%'
上面这一条sql
就是一直在等待的sql
,他的elapsed_time
还在不断增加,下面的sql
不会增加了,执行完了但是没有提交
Oracle
中有一个公式service time
或者叫response time
=cpu time
+wait time
也就是说执行一条sql
语句的时间等于cpu
时间加上等待的时间
也就是v$sql
中的elapsed_time
=cpu time
+wait time
上图中第一条sql
,elapsed_time
远远大于cpu time
并且还在不断地增加,说明这条sql
根本没有执行,一直在等待行级锁,他现在的cpu time
是sql
语句解析消耗的cpu time
;
第二条sql
,elapsed_time
等于cpu time
并且不再增加了,说明这个执行了完了而且几乎没有等待
DB TIME:所有活动session
的总的时间(不算后台进程的),上图中的第一条sql
也是所有非后台进程session
中的一个,他就给db time
增加了很多的时间,等待时间很长意味着执行效率很差,优化就是要降低DB TIME
,要么降低wait time
要么降低cpu time