部分性能参数
CPU:
cpu_count
内存:
memory_target
(11g)memory_max_target
(11g)sga_target
sga_max_size
pga_aggregate_target
I/O:
DB_FILE_MULTIBLOCK_READ_COUNT
DB_WRITER_PROCESSES
DISK_ASYNCH_IO
DBWR_IO_SLAVES
网络:
sessions
processes
open_cursors
优化器:
optimizer_index_cost_adj
optimizer_mode
optimizer_dynamic_sampling
cursor_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 .. 100
loop
将数据块x从数据缓冲池中向磁盘写入,然后等待磁盘写入完成的消息
end loop
异步方式写入数据:
for i in 1 .. 100
loop
DB_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_rows
all_rows
optimizer_dynamic_sampling
设置动态采样的级别 0 到 10。
oracle 9i默认值 1。从oracle 10g开始,默认值2。
对于OLAP系统,可以将该值设置的稍微大一些。
部分性能视图
CPU:
V$SYSSTAT
V$SESSTAT
内存:
V$MEMORY_TARGET_ADVICE
V$SGA_TARGET_ADVICE
V$PGA_TARGET_ADVICE
GV$SHARED_POOL_ADVICE
I/O:
V$IOSTAT_FILE
V$IOSTAT_FUNCTION
V$FILESTAT
V$ROLLSTAT
网络:1
V$IOSTAT_NETWORK
对象:
V$SEGSTAT
、V$SEGMENT_STATISTICS
、V$SEGSTAT_NAME
等待事件:
V$ACTIVE_SESSION_HISTORY
V$SESS_TIME_MODEL
、V$SYS_TIME_MODEL
V$SESSION_WAIT
V$SESSION
V$S$SSION_EVENT
其他:
V$SQL
V$LATCH
V$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
:会话的资源统计信息