** ORACLE ** ** 性能诊断―学习 statspack ** ** 笔记(二) [ ** ** 概述 ] **
** 作者:刘颖博 **
** 时间: 2004-3-3 **
** mail ** ** : [email protected] ** ** ,请指正 **
** 转载请注明出处及作者 **
** ORACLE ** ** 性能诊断涉及对象 **
A. 服务器、网络以及磁盘(外部的环境)
B. 实例( SGA ,后台进程)
C. 对象(表,索引,段……)
D. SQL
E. 设计(指的是应用的设计,这部分一般说来是很难改变了)
ORACLE 性能诊断要遵循上面的顺序,先察看服务器是否存在问题,主要从 CPU , RAM , DISK 配置是否存在问题,检查操作系统的核心参数的设置等等;如果是跨地域的进行共享的多个 ORACLE ,网络通信性能也是非常的关键的, ORACLE 利用的是 TNS ( Transparent Network Substrate 透明网络层)提供数据库之间的分布传输;另外影响 ORACLE 相应时间的最大的单独组成部分是磁盘 I/O ,能够减少磁盘 I/O 的任何事情都会对 ORACLE 的性能产生正面的影响,比如改变 ORACLE 初始化参数,调整相应的 SQL 等;对于 ORACLE 的实例调整应该注意的问题是,过载的 ORACLE 的 SGA 会导致严重的性能问题,对于 ORACLE 实例的调整主要包括:初始化参数、数据缓冲存储( DEFAULT 、 KEEP 、 RECYCLE )和 SGA 中共享池和库缓存等;还有就是 ORACLE 对象的调整,包括存储参数等等;最后是 SQL 语句的调整。
** STATSPACK ** ** 概述 **
STATSPACK 来源在 ORACLE 最早版本就存在的 UTLBSTAT 和 UTLESTAT 工具。开始的 BSTAT-ESTAT 工具就可以直接从 ORACLE 的内存结构中获取信息。
STATSPACK 通过获取数据库当前状态的快照来进行工作。大部分的情况,我们会规划一个以小时为单位来收集数据的 JOB ,并在需要的时候请求附加快照。
当我们获取快照时, STATSPACK 会从 SGA 内部的 RAM 内存结构中采样,并记录到相应的 STATSPACK 表中,注意的是,大多数情况下, SGA 中的 V$ 视图与相应的的 STATSPACK 表之间存在直接的对应关系,比如:
** V$SYSSTAT --------->STATS$SYSSTAT **
SQL> DESC V$SYSSTAT
Name Null? Type
----------------------------------------- -------- ----------------------------
STATISTIC# NUMBER
NAME VARCHAR2(64)
CLASS NUMBER
VALUE NUMBER
SQL> DESC STATS$SYSSTAT
Name Null? Type
----------------------------------------- -------- ----------------------------
SNAP_ID NOT NULL NUMBER(6)
DBID NOT NULL NUMBER
INSTANCE_NUMBER NOT NULL NUMBER
STATISTIC# NOT NULL NUMBER
NAME NOT NULL VARCHAR2(64)
VALUE NUMBER
在理解 STATSPACK 工具的时候,很关键的是要明白通过 STATSPACK 快照收集的信息是累计值,从 V$ 视图中收集到起始时间的数据库信息,然后进行持续累加,知道实例中止,我想,这也许就应该是 STATSPACK 不能产生两张跨越 SHUTDOWN 的快照的报告的原因吧。
对应 STATSPACK 存在一系列的 STATSPACK 表,不同的 ORACLE 版本会有一定的差异。这些表大体上分为控制表、参数表、事件表、事务处理表、并行服务器表、概要表、系统表等等
下面是我列出的 ORACLE9I 的 STATSPACKE 表:
SQL> select table_name from dba_tables where table_name like 'STATS$%';
TABLE_NAME
------------------------------
STATS$DATABASE_INSTANCE
STATS$LEVEL_DESCRIPTION
STATS$SNAPSHOT
STATS$DB_CACHE_ADVICE
STATS$FILESTATXS
STATS$TEMPSTATXS
STATS$LATCH
STATS$LATCH_CHILDREN
STATS$LATCH_PARENT
STATS$LATCH_MISSES_SUMMARY
STATS$LIBRARYCACHE
TABLE_NAME
------------------------------
STATS$BUFFER_POOL_STATISTICS
STATS$ROLLSTAT
STATS$ROWCACHE_SUMMARY
STATS$SGA
STATS$SGASTAT
STATS$SYSSTAT
STATS$SESSTAT
STATS$SYSTEM_EVENT
STATS$SESSION_EVENT
STATS$BG_EVENT_SUMMARY
STATS$WAITSTAT
TABLE_NAME
------------------------------
STATS$ENQUEUE_STAT
STATS$SQL_SUMMARY
STATS$SQLTEXT
STATS$SQL_STATISTICS
STATS$RESOURCE_LIMIT
STATS$DLM_MISC
STATS$UNDOSTAT
STATS$SQL_PLAN_USAGE
STATS$SQL_PLAN
STATS$SEG_STAT
STATS$SEG_STAT_OBJ
TABLE_NAME
------------------------------
STATS$PGASTAT
STATS$IDLE_EVENT
STATS$PARAMETER
STATS$INSTANCE_RECOVERY
STATS$STATSPACK_PARAMETER
STATS$SHARED_POOL_ADVICE
STATS$SQL_WORKAREA_HISTOGRAM
STATS$PGA_TARGET_ADVICE
41 rows selected.
其中 STATSPACK 表的主要锚定点是 STATS$DATABASE_INSTANCE, 具体的表的介绍我打算放到后面的文章进行讨论。
可以说,以前我们的 ORACLE 性能调整主要是一种 REACTIVE TUNNING (反应式调整),通过 STATSPACK 工具,我们可以进行长期趋势分析、性能问题事后分析、资源规划以及预测建模等 , 我们完全可以采用一种 PROACTIVE TUNNING (前瞻式调整)。并且从 ORACLE9I 开始, ORACLE 可以动态的改变 ORACLE 实例的内存配置, ORACLE 也正朝着动态数据库配置迈进。
(待续)
……………………………………………………………………………………
** 参考 **
Donald K.Burleson 《 ORACLE HIGH-PERFORMANCE TUNING WITH STATSPACK 》