部分性能参数

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_targetpga_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区的动态调整。

  1. 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)

同步方式写入数据:

  1. for xi in 1 .. 100
  2. loop
  3. 将数据块x从数据缓冲池中向磁盘写入,然后等待磁盘写入完成的消息
  4. end loop

异步方式写入数据:

  1. for i in 1 .. 100
  2. loop
  3. DB_WRITER把数据块直接送给操作系统,不再等待系统的反馈,继续下一个块操作
  4. 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):

  1. # 此时开启了一个系统进程process,但是没有session连接到数据库
  2. sqlplus /nolog

一个process对应一个session的情况(process = session):

  1. # 连接上数据库
  2. sqlplus test/test
  1. -- 查看session列表
  2. 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$SEGSTATV$SEGMENT_STATISTICSV$SEGSTAT_NAME

等待事件:

  • V$ACTIVE_SESSION_HISTORY
  • V$SESS_TIME_MODELV$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:会话的资源统计信息