调整缓冲区高速缓存Cache(Buffer Cache)性能
Buffer cache由数据块组成
1. Buffer cache工作原理
LRU列表:MRU ………………. LRU(全表扫描FTS放在LRU端)
缓冲区块状态:Free、Pinned、Clean、Dirty
Dirty List或Write List(写列表)
数据库写进程DBW0将缓冲区高速缓存Cache中数据写到数据文件中
2.测量Buffer cache性能
测量Buffer cache命中率:
SQL> select 1-((physical.value – direct.value – lobs.value)/logical.value) “Buffer Cache Hit Ratio” from V$SYSSTAT physical, V$SYSSTAT direct,
V$SYSSTAT lobs, V$SYSSTAT logical where physical.name = ‘physical reads’
And direct.name = ‘physical reads direct’ and
lobs.name = ‘physical reads direct (lob)’
And logical.name = ‘session logical reads’;
“Buffer Cache Hit Ratio”值要 > 90%
使用STATSPACK来监视Buffer cache
使用REPORT.TXT来监视Buffer cache
非命中率指标:Free Buffer Inspected、Free Buffer Waits、Buffer Busy Waits(V$sysstat)
使用Performance Manager(数据库例程)来监视Buffer Cache
3. 提高缓冲区高速缓存Cache性能思路方法
加大Buffer Cache大小:init.ora参数DB_CACHE_SIZE(动态参数)
使用Buffer Cache Advisory功能决定Buffer Cache大小:
首先将init.ora参数DB_CACHE_ADVICE设成ON然后查询V$DB_CACHE_ADVICE
使用多个缓冲区池:
Keep Pool: DB_KEEP_CACHE_SIZE
Recycle Pool:DB_RECYCLE_CACHE_SIZE
Default Pool: DB_CACHE_SIZE
在内存中缓存Cache表: 表CACHE选项对优化小表全表扫描
正确创建索引
4.调整Large Pool和Java POOL
Large Pool用于共享服务器、RMAN、并行查询、DBWR从属进程
Large Pool大小通过init.ora参数Large_pool_size设置默认为8M
从V$sgastat中监视free memory值:
SQL>SELECT name,s FROM V$sgastat WHERE pool = ‘large pool’;
JAVA_POOL池默认大小为32M对于大型Java应用JAVA_POOL池大小应大于50M
init.ora参数java_pool_size
从V$sgastat中监视free memory值
SQL>SELECT name,s FROM V$sgastat WHERE pool = ‘java pool’;
调整重做有关性能
Oracle重做有关组件包括:Redo Log Buffer、Online Redo Log、LGWR、Archive Log、Checkpo、Arch0
1. 监视Redo Log Buffer性能
Redo Log Buffer不采用LRU(Least Recently Used)算法治理
当下列事件发生时Redo Log Buffer内容存盘:
Commit时、每3秒、空间使用1/3、达到1M、检查点
假如写入Redo Log Buffer速度超过LGWR存盘速度就会因等待而降低性能
监视Redo Log Buffer重试率(<1%)
Select retries.value/entries.value “Redo Log Buffer Retry Ratio”
From V$sysstat retries, V$sysstat entries
Where retries.name = ‘redo buffer allocation retries’
And entries.name = ‘redo entries’;
“Redo Log Buffer Retry Ratio”值要 < 1%
Select name,value from V$sysstat where name=’redo log space requests’;
假如该值大需要增加Redo Log Buffer
2. 提高Redo Log Buffer性能
增加Redo Log Buffer大小:init.ora参数log_buffer
减小重做日志生成量(假如设置表NOLOGGING属性下列操作不记录在Online Redo Log中:用SQL* Loader直接路径加载
NOLOGGING属性还可用于下列SQL语句:CREATE TABLE AS SELECT、CREATE INDEX、
ALTER INDEX REBUILD、CREATE TABELSPACE)
3. 调整检查点进程性能
测量检查点进程性能:没有完成检查点进程次数
select * from V$system_event;
两个事件:checkpo completed、log file switch(checkpo incomplete)
Select * from V$sysstat
background checkpos started和background checkpos completed
使用Alert日志来记录检查点进程:init.ora参数log_checkpo_to_alert
使用Performance Manager来测量检查点进程性能:I/O中平均灰数据队列长度(假如为0,介绍说明检查点太频繁)
建议调整online redo log大小使检查点进程每20-30分钟执行次
4. 调整联机重做日志文件
使用V$system_event来监视联机重做日志文件性能:
log file parallel write、log file switch completed
调整联机重做日志文件思路方法:和数据文件、控制文件、归档日志文件分开放在原始设备上
5. 调整归档性能
检查归档进程性能:通过V$system_event中log file switch(archiving needed)事件
检查每个归档进程状态:V$archive_processes
创建多个归档进程:init.ora参数LOG_ARCHIVE_MAX_PROCESSES(默认为2)
调整磁盘I/O性能
哪些操作会导致磁盘I/O:
将Buffer cache中内容写到数据文件
写回退段
将数据文件内容读到Buffer cache中
将Redo log Buffer中内容写到online redo log中
将online Redo log中内容归档到 archive log中
1. 调整表空间和数据文件
测量数据文件I/O:使用V$filestat
使用STATSPACK来测量数据文件I/O
使用REPORT.TXT来测量数据文件I/O
使用Performance Manager(I/O)来测量数据文件I/O
建议:
不要在SYSTEM表空间存放用户数据
将 I/O操作均分到几个数据文件上(监视数据文件I/O操作数)
使用本地治理表空间
将数据库文件和其它文件分开
使用分区表和分区索引
将大表放在单独表空间
创建单独回退表空间
创建个或多个临时表空间
不要将联机重做日志文件和归档联机重做日志文件放在同个设备上
至少将个控制文件放在个单独设备上
检查V$sysstat中’table scans(long tables)’
使用init.ora参数DB_FILE_MULTIBLOCK_READ_COUNT(默认为16)来优化表扫描
2. 调整DBW0性能
监视DBWR0性能
使用V$system_event监视下列事件:buffer busy waits、free buffer waits、
db file parallel write、write complete waits、
使用init.ora参数DBWR_IO_SLAVES(优化磁盘I/O)、
DB_WRITER_PROCESSES(默认为1优化Buffer Cache内部治理)
假如DBWR_IO_SLAVES设为非0值DB_WRITER_PROCESSES值无效
3.调整段I/O
避免动态空间分配
表有关存储特性
空闲百分比(PCTFREE):每个对象数据块中为今后更新该对象而保留空间百分比可以输入0到99的间值
默认值为10%
已用百分比(PCTUSED):Oracle数据库为该对象每个数据块保留已用空间最小百分比当个块已用空间低于“已用百分比”值时则该块将成为插入行目标可以输入1到99的间值默认值为40%
最小数量:创建段时已分配总区数默认值为1可以输入1或大于1值
SQL> alter table emp allocate extent ;
事务处理数量
值:在分配给该对象每个数据块内分配给事务处理条目数量可以输入1或2(对于簇和索引)到255的间值
最大值:可同时更新分配给对象数据块并行事务处理最大数量可以输入1到255的间值
自由表
列表:表、簇或索引每个自由表组自由表数量可以输入1或大于1值默认值为1
组:表、簇或索引自由表组数量可以输入1或大于1值默认值为1
缓冲池
行转移(更新行时超过块可用空间)和行链接(行大小超过块大小)概念
使用V$sysstat来监视行转移和行链接:table fetch continued row
SQL>analyze table emp compute statistics;
使用DBA_TABLES来查询统计信息
SQL> alter table emp deallocate unused;
SQL> alter table scott.emp move tablespace users;
表高水位标志High Water Mark(HWM)
4.调整排序IO
哪些SQL语句需要排序操作:order by、group by、selec distinct、union、
ersect、minus、analyze、create index、联接
V$sysstat内存排序和磁盘排序(临时表空间中)
监视排序性能(内存排序比例>95%)
使用init.ora参数SORT_AREA_SIZE(512K)、SORT_AREA_RETAINED_SIZE、
pga_aggregate_target、WORKAREA_SIZE_POLOCY
使用Performance Manager(数据库例程)来监视排序
如何避免排序:SQL语法、正确索引、创建索引、ANALYZE
v$sort_segment、v$sort_usage
使用Tablespace Map
使用 Reorg Wizard
5. 优化回退段
个回退段区间可以分配给多个事务回退段个数据块只能分配给个事务
测量回退段事务表争用
select * from V$system_event where event like ‘%undo%’;
回退段事务表等待时间应接近于0
select * from V$waitstat;
V$rollstat
回退段事务表访问成功率应>95%
回退段区间争用
V$waitstat、V$sysstat
回退段事务环绕(Wrap):个事务占用回退段从个区间扩展到另个区间
回退段动态区间分配
V$system_event
使用V$rollstat来监视回退段使用情况
使用Performance Manager(后台进程)来测量回退段
提高回退段性能
Oracle9i中撤消表空间
建议:每 4个事务使用个回退段最多不超过20个回退段
会退段区间大小512k最小区间数20
明确分配回退段给事务
SQL> transaction use rollback segment rbs01;
最小化回退段活动:EXPORT、IMPORT、SQL* Loader时加commit=y参数
Oracle9i中撤消表空间
调整闩(latch)和锁定(lock)
1. 调整闩(latch)
闩可以作为内存性能另个指标
1.闩:等待闩和立即闩(V$lacth共239个)
数据库中是否存在闩争用V$system_event("latch free")
几个重要闩:shared pool、library cache、cache buffers lru chain、
cache buffers chains、redo allocation、redo copy
select * from V$latch where misses!=0;
2.自由列表:V$system_event("buffer busy waits")
V$waitstat
测量哪些段存在自由列表争用:dba_segments、V$session_wait
alter table scott.emp storage (freelists 5);
自动段空间治理表空间
2. 调整锁定
DML锁(TM)和DDL锁(TX)
锁定模式:
RX:对表UPDATE、INSERT、DELETE时获得
RS:对表SELECT … FOR UPDATE时获得
S: LOCK TABLE EMP IN SHARE MODE; 可以是多个用户获得
SRX: LOCK TABLE EMP IN SHARE ROW EXCLUSIVE MODE; 只能是个用户获得
外键约束时锁定死锁
用Lock Monitor监视锁定
调整操作系统
1. 调整操作系统
观察内存和CPU利用率(<90%)
2. 使用Resource Manager
资源使用者组个用户可以是多个资源使用者组成员但次只有个组是活动
确定用户CPU利用率(v$sesstat和v$sysstat)
资源计划:由资源计划指令组成次只能有个资源计划是活动(V$rsrc_plan)
alter system resource_manager_plan=system_plan;
select username,RESOURCE_CONSUMER_GROUP from V$session;
子计划
资源计划调度
使用Expert进行优化
第步:创建个优化会话(tuning session)
第 2步:确定优化范围(scope)
第 3步:收集数据
第 4步:复查(review)已收集到数据
第 5步:生成建议案建议报告
第 6步:创建实现建议所需SQL脚本
最新评论