1。当前数据库的会话数量
select count(*) from v$session where username is not null;
2. 当前数据库的活动的会话数量
select count(*) from v$session where status='active' and username is not null;
3.当前数据库逻辑读总量
select a.value+b.value logical_reads_number from v$sysstat a,v$sysstat b
where a.name='db block gets' and b.name='consistent gets';
4.当前数据库物理读总量
select value physical_reads_number where name='physical reads';
5.buffer_cache_size 命中率
select round(100*(1-c.value/(a.value+b.value)),2) 命中率
from v$sysstat a,v$sysstat b ,v$sysstat c
where a.name='db block gets' and b.name='consistent gets' and c.name='physical gets';
注:db block gets(当前请求的块数)
consistent gets(获得一致性读取的块数)
physical gets(物理读,即IO读取的块数)
6.library cache命中率
select round(sum(pins-reloads)/sum(pins)*100,2) 命中率 from v$librarycache;
注:pins(执行成功的语句)
reloads(执行失败的语句)
7.实例是否在线
select active_state from v$instance;
8.实例的激活的数量
select count(*) from v$active_instances;
9.在线数据文件的的数量
select count(*) from v$datafile where status='ONLINE';
10.表空间的状态
select count(*) from dba_tablespaces where status='OFFLINE';
11.数据库表空间的利用率
select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/1024 "used MB",b.bytes/1024/1024 "free MB",round(((a.bytes-b.bytes)/a.bytes)*100,2) "percent_used"
from
(select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name,sum(bytes) bytes,max(bytes) largest from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes);
TABLESPACE_NAME Sum MB used MB free MB percent_used
------------------------------ ---------- ---------- ---------- ------------
USERS 10 3.5 6.5 35
UNDOTBS1 30 12.0625 17.9375 40.21
EXAMPLE 100 77.6875 22.3125 77.69
SYSAUX 290 275.5 14.5 95
SYSTEM 490 485 5 98.98
注:视图dba_data_files(显示表空间的总大小)
视图dba_free_space(显示表空间空闲的大小)
使用函数计算出总大小,已经使用的大小,空闲大小,使用的百分比
以相同tablespace_name字段合并俩个视图,得出数据库表空间的利用率。
12.数据库空闲的等待事件
slect name,wait_class from v$event_name where wait_class='IDLE';
13.当前数据库连接的活动session正在等待的事件
select sid,event,wait_class,wait_time from v$session_wait;
14.数据文件当前的状态
select file_name,status from dba_data_files;
15.数据库空闲块大小
select tablespace_name, count(*) 空闲块 from dba_free_space
group by tablespace_name;
=========================================
等待事件分析:
1.视图
v$envent_name,三个字段很重要:parameter1,parameter2,parameter3.
v$system_wait_class
v$session
v$session_wait
v$system_event
v$session_wait_history
v$active_session_history
V$sgastat
v$segstat_name
v$session_longops
v$sql_plan
v$sql_text
v$lock
v$latch
v$latch_chidren
2.利用视图来追踪和诊断数据库运行状态:
下面视图的组合访问,可以全面真实的记录,监控和反映数据库的运行状态
v$session--->v$session_wait--->v$session_wait_history--->v$active_session_history
---->wrh$_active_session_history---->dba_hist_active_sess_history
活动数据库的开始
当前活动session的等待情况
记录活动session的最经10次等待
是ASH的核心,记录活动session的历史信息。
是v$active_session_history的存储地
通过这个视图进行历史数据的访问
3.重要等待事件
1) db file sequential read(数据文件读取顺序)
读取一个索引块或通过索引读取一个数据块时候会记录这个等待
是UserI/O一类的等待事件
通常是单块读。
读数据块到buffer
2) db file scattered read(全表扫描)
离散读取,将存储在磁盘或磁带上连续的数据块离散的读入到多个不连续的buffer里。
通常是多块读(收到db_file_mulitiblock_read_count参数的限制)。
通常是应用问题或索引缺失造成的。
是UserI/O一类的等待事件
读数据块到buffer
3) direct path read/write(直接路径读/写)
是UserI/O一类的等待事件
单块读/多块读
读数据块到PGA
磁盘排序IO读取最易触发这类等待事件
造成磁盘排序频繁,是临时表空间的问题。
加大内存的pga_aggregate_target空间,以便缓解硬盘的IO。
4) log(日志文件相关等待)
---日志切换(需要归档)
因为日志组循环组写满之后,在覆盖先前的日志时,发现日志归档还没有完成,
由于redo不能写出,出现等待事件。
可能是I/O存在问题,或日志组设置不合理造成。
解决办法:
增大日志文件或增加日志组
移动归档文件到i/o性能好的磁盘或库带,比喻裸设备或ASM设备
调整log_archive_max_processes参数
尽量使用RAIND10,而不是RAIND5来存放日志文件。
----日志切换(检查点未完成)
5) enqueue(队列等待)
Oracle在数据库内部用enqueue等待来记录锁定
TM锁:表级别锁定
TX锁:事务锁定
MR锁:介质锁定
6) latch free(闩锁释放)
oracle在数据库内部用latch free等待事件来记录闩
查看索引情况
v$user_indexes
v$user_ind_columns
===========================
top 5等待事件
1. latch free
主要表现为cache buffers chains的竞争
原因是多个并发进程对同一个block进行访问从而产生latch的竞争
会严重影响数据库性能,对应用程序进行修正或对SQL进行优化可以减小该竞争
2. db file scattered read
进行全表扫描,读取数据块时候是多块读入内存
发生这类等待事件很可能是没有索引引起的
3. direct path read/write
绕过buffer cache,将数据块直接读/写到PGA,来进行排序操作,磁盘I/O消耗很多,
可以增加pga_aggregate_target空间,以便缓解硬盘的IO.
4. log(日志文件相关等待)
当在归档的时候发生的日志切换:
因为日志组循环组写满之后,在覆盖先前的日志时,发现日志归档还没有完成,
由于redo不能写出,出现等待事件。可能是I/O存在问题,或日志组设置不合理造成。
可以增大日志文件或增加日志组,移动归档文件到i/o性能好的磁盘或库带,比喻裸设备 或ASM设备,调整log_archive_max_processes参数,增加写日志的进程.
5. free buffer waits
增加db_cache_size
手动触发DBWR写入,以缓解cache buffer的压力.
=============================
热块竞争与解决方案
1.具体表现为latch free等待事件
2.而latch free等待主要表现为cache buffers chains的竞争
3.通过select sid,seq#,event from v$session_wait也能查到
4.通过视图v$latch_children找到热块的操作对象
5.x$bh的字段hladdr(hash chain latch address)和v$latch_children.addr进行关联,这样就把
具体的latch竞争和数据块关联了.结合视图dba_extents,就找到了热块竞争的对象了.
6.找到热块竞争对象之后,结合v$sqltext或sqlarea,找到频繁操作这些热块对象的SQL.
7.最后对这些SQL进行优化.
====================================
阅读(1128) | 评论(0) | 转发(0) |