部分性能参数
CPU:
cpu_count
内存:
memory_target(11g)memory_max_target(11g)sga_targetsga_max_sizepga_aggregate_target
I/O:
DB_FILE_MULTIBLOCK_READ_COUNTDB_WRITER_PROCESSESDISK_ASYNCH_IODBWR_IO_SLAVES
网络:
sessionsprocessesopen_cursors
优化器:
optimizer_index_cost_adjoptimizer_modeoptimizer_dynamic_samplingcursor_sharing
cpu_count
显示的是逻辑CPU数量(thread),比如:cpu_count=8可以是8个单核、4个双核或者2个4核。
对并行度和代价有影响。
memory_target
oracle 9i:引入pga_aggregate_target,可以自动对PGA进行调整
oracle 10g:引入sga_target,可以自动对SGA进行调整
oracle 11g:对这里两部分进行综合,引入memory_target,可以自动调整所有的内存,这就是新引入的自动内存管理特性
当memory_target设置为非0值。如果sga_target和pga_aggregate_target已经设置大小,则这两个参数将各自被分配为最小值为它们的目标值。memory_target = sga_target + pga_aggregate_target,大小和memory_max_size一致。
当memory_target没有设置,或者设置为0(11g默认为0),则11g初始状态下取消了memory_target的作用,完全和10g在内存管理上一致,完全向下兼容。如果sga_target设置了值,则自动调整SGA中的shared pool、buffer cache、redo log buffer、java pool、larger pool 等内存空间大小。PGA则依赖pga_aggregate_target的大小。sga和pga不能自动增长和自动缩小。
memory_max_target
允许memory_target调整的上限。
当设置memory_max_target而忽略memory_target,Oracle设置memory_target=0(不使用自动内存管理)。
当设置memory_target的值,忽略memory_max_target,oracle将自动将memory_max_target设置为memory_target的值。
同时设置两个值,memory_target的上限值为memory_max_target。
SGA_TARGET
对SGA区的动态调整。
show sga;
pga_aggregate_target
PGA内存空间总和的动态调整。
DB_FILE_MULTIBLOCK_READ_COUNT
多数据块的读取:
- FTS(Full Table Scan)
- INDEX_FFS(Index Fast Full Scan)
DB_WRITER_PROCESSES
我们可以设置多个DB_WRITER进程,以加快数据从缓冲区向磁盘写入的速度,这在写操作非常大的数据库上非常有用。
需要注意的是,这个参数只用于数据库的写操作,和数据库读取没有任何关系,数据块的读取是用户会话的服务端进程来完成的。
DISK_ASYNCH_IO(异步IO)
同步方式写入数据:
for xi in 1 .. 100loop将数据块x从数据缓冲池中向磁盘写入,然后等待磁盘写入完成的消息end loop
异步方式写入数据:
for i in 1 .. 100loopDB_WRITER把数据块直接送给操作系统,不再等待系统的反馈,继续下一个块操作end loop
sessions & processes
processes:数据库允许产生的process数量。
sessions:数据库允许产生的session数量。
通常情况下:sessions = (1.5 * processes) + 22
process和session的关系:
- process表示操作系统级别的一个进程
- session表示process和数据库建立的会话数量
一般情况下,一个process就是一个session。但是特殊情况下,process可以大于、等于、小于session。
有了process但是没有session的情况(process > session):
# 此时开启了一个系统进程process,但是没有session连接到数据库sqlplus /nolog
一个process对应一个session的情况(process = session):
# 连接上数据库sqlplus test/test
-- 查看session列表select username,paddr from v$session where username is not null;
一个process对应多个session的情况(process < session):
连接上数据库后,开启autotrace。
set autotrace on stat;
-- 此时可以看到出现了两个相同用户名、相同地址的会话。多出来的那个就是autotrace开启的会话
select username,paddr from v$session where username is not null;
如果要查看sql的实际执行信息,使用10046事件看到的比autotrace更准确。因为
set auto trace on实际上是又开启了一个会话,使用新开启的这个会话去统计执行sql的那个会话的执行信息。
open_cursors
指定某个会话能够打开的最大游标数。对OLTP系统比较有意义。如果开发人员开发的代码没有关闭游标,就可能因为超过游标数而报错。
默认值是50。当这个参数设置太小时,可能会导致程序执行出错。设置过大会耗费系统资源。
取值范围是 0 到 65535。
optimizer_index_cost_adj
CBO计算成本时索引的权重修正值。可以通过调整该参数,使优化器倾向于使用索引或者不倾向于使用索引。
show parameter OPTIMIZER_INDEX_COST_ADJ;
默认值100。值越小,越倾向于使用索引。
optimizer_mode
优化器模式:
first_rows_[1 | 10 | 100 | 1000]first_rowsall_rows
optimizer_dynamic_sampling
设置动态采样的级别 0 到 10。
oracle 9i默认值 1。从oracle 10g开始,默认值2。
对于OLAP系统,可以将该值设置的稍微大一些。
部分性能视图
CPU:
V$SYSSTATV$SESSTAT
内存:
V$MEMORY_TARGET_ADVICEV$SGA_TARGET_ADVICEV$PGA_TARGET_ADVICEGV$SHARED_POOL_ADVICE
I/O:
V$IOSTAT_FILEV$IOSTAT_FUNCTIONV$FILESTATV$ROLLSTAT
网络:1
V$IOSTAT_NETWORK
对象:
V$SEGSTAT、V$SEGMENT_STATISTICS、V$SEGSTAT_NAME
等待事件:
V$ACTIVE_SESSION_HISTORYV$SESS_TIME_MODEL、V$SYS_TIME_MODELV$SESSION_WAITV$SESSIONV$S$SSION_EVENT
其他:
V$SQLV$LATCHV$SENQUEUE_STAT
CPU
V$SESSSTAT:某个会话消耗CPU的值
select a.name, b.value from v$sesstat b, v$statname a
where a.STATISTIC#=b.STATISTIC# and a.name like '%CPU%' and sid=66;
V$SYSSTAT:系统级别消耗CPU的值
内存
V$MEMORY_TARGET_ADVICE:oracle自动管理内存的建议器。oracle 11g新增的视图。
select memory_size,memory_size_factor,estd_db_time,estd_db_time_factor,version
from v$memory_target_advice;
oracle会构造一个环境,内存扩大或缩小n倍,测算内存变化之后数据库用户操作耗费的时长变化。
返回结果示例:
| MEMORY_SIZE | MEMORY_SIZE_FACTOR(当前内存的n倍) | ESTD_DB_TIME | ESTD_DB_TIME_FACTOR | 说明 |
|---|---|---|---|---|
| 380 | 1 | 115475 | 1 | 当前内存的1倍,即当前内存为380M,数据库操作需要花费的时间为115475 |
| 95 | 0.25 | 200500 | 1.7 | 当内存缩小到四分之一时,数据库操作需要花费的时间变成现在的1.7倍 |
| 190 | 0.5 | 125600 | 1.1 | 内存缩小到二分之一时,数据库操作需要花费的时间变为现在的1.1倍 |
| 760 | 2 | 80525 | 0.7 | 内存扩大为现在的2倍时,数据库操作需要花费的时间变为现在的0.7倍 |
结合这个建议,可以得出:当前这个数据库系统,如果需要减少内存,内存缩小一半之后,数据库操作耗时只是原来的1.1倍,可以缩小一半来节约资源。在内存扩大成2倍后,数据库耗时变成现在的0.7倍,所以如果内存充足,也可以考虑扩大内存。
IO相关
V$IOSTAT_FILE:显示各种文件的I/O统计信息。(数据文件、临时文件、控制文件、日志文件、归档文件等等)
对象相关
V$SEGSTAT:获得某对象的各类统计信息。
网络会话相关
V$SESSION:某会话的当前各种状态,比如关联v$sql视图查看当前会话的sql语句。
V$SESSON_WAIT:会话当前等待事件的详细信息
V$SESSION_EVENT:会话的所有等待事件的详细信息
V$SESSTAT:会话的资源统计信息
