如果系统存在过多的磁盘排序,会导致临时表空间操作频繁,对于这种情况,可以考虑为不同用户分配不同的临时表空间,使用多个临时文件,写入不同磁盘或者裸设备,从而降低竞争,提高性能;对于 Oracle 8i 的数据库,应该考虑使用本地管理(Local)的临时表空间,而不是字典(DICTIONARY)管理。
从 dba_tablespaces 视图可以获得这部分信息:
SQL> select tablespace_name,EXTENT_MANAGEMENT from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN
------------------------------ ----------
SYSTEM DICTIONARY
RBS DICTIONARY
TEMP DICTIONARY
USERS LOCAL
4 rows selected.
可以看一个 Statspack 报告的典型例子:
DB Name DB Id Instance Inst Num Release OPS Host
---------- ----------- ---------- -------- ---------- ---- ----------
DB 294605295 db 1 9.1.5.0.0 NO IBM
Snap Length
Start Id End Id Start Time End Time (Minutes)
-------- -------- -------------------- -------------------- -----------
65 66 08-11 月-03 16:32:42 08-11 月-03 16:54:00 21.30
这是一个 20 分钟的采样报告,我们看到 direct path read/write 的等待都很显著:
Top 5 Wait Events
~~~~~~~~~~~~~~~~~ Wait % Total
Event Waits Time (cs) Wt Time
-------------------------------------------- ------------ ------------ -------
direct path write 98,631 3,651 44.44
log file switch completion 62 2,983 36.31
direct path read 37,434 1,413 17.20
db file sequential read 86 109 1.33
control file sequential read 3,862 34 .41
-------------------------------------------------------------
这可能意味着系统存在着大量的磁盘排序操作。基于此,继续向下追查相关排序部分统
计数据:
Instance Activity Stats for DB: DB Instance: db Snaps: 65 -
Statistic Total per Second per Trans
--------------------------------- ---------------- ------------ ------------
…….
sorts (disk) 64 0.1 0.4
sorts (memory) 861 0.7 4.7
sorts (rows) 2,804,580 2,194.5 15,159.9
64 次的 sort disk,相当显著的磁盘排序。
在 Statspack 的报告中,存在一个性能指标,称为内存排序率(In-memory Sort Ratio),用于衡量系统的排序操作,这个指标就是由以上两个统计信息 Sort (disk)和 Sort(memory)得出:
In-memory Sort Ratio = Sort(memory)/ [ sorts(disk) + Sort(memory)]
对于本例,这个比率计算值为:
In-memory Sort Ratio = 861 / (861 + 64)≈ 93.08 %
从 Statspack 的报告中,也可以获得这个信息:
Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait Ratio: 100.00
Buffer Hit Ratio: 20.27
Library Hit Ratio: 99.81
Redo NoWait Ratio: 99.74
In-memory Sort Ratio: 93.08
Soft Parse Ratio: 99.66
Latch Hit Ratio: 100.00
对于显著的磁盘排序,可以很容易地猜测到,临时表空间的读写操作肯定相当频繁,从
Statspack 报告中文件 I/O 部分的统计数据可以验证:
File IO Statistics for DB: GHCXSDB Instance: ghcxsdb Snaps: 65 - 66
Tablespace Filename
------------------------ ----------------------------------------------------
Reads Avg Blks Rd Avg Rd (ms) Writes Tot Waits Avg Wait (ms)
-------------- ----------- ----------- -------------- ---------- -------------
…….
PERFSTAT D:\ORACLE\ORADATA\PERFSTAT.DBF
88 1.0 12.5 821 0
RBS D:\ORACLE\ORADATA\GHCXSDB\RBS01.DBF
7 1.0 0.0 1,399 0
SYSTEM D:\ORACLE\ORADATA\GHCXSDB\SYSTEM01.DBF
17 1.0 11.8 50 0
TEMP D:\ORACLE\ORADATA\GHCXSDB\TEMP01.DBF
223,152 1.5 0.2 371,303 0
对于这种情况,在 Oracle 9i 之前,可以适当增加 sort_area_size 的大小;从 Oracle 9i 开始,可以适当增大 pga_aggregate_target,以缩减磁盘排序对于硬盘的写入,从而ᨀ高系统及应用相应。但是通常应该及时检查应用,确认是否因为应用问题而导致了过度排序,从而从根本上解决问题。




