1、优化器统计
对于性能来说,执行计划的选择十分重要。标准做法是使用优化器来选择执行计划。优化器紧密依赖于一些统计量,从而能够评价众多可行执行计划的效率以及选择某个执行计划。
1.1、对象统计量
对某个表进行分析可以收集优化器能够使用的、与这个表相关的统计量。这些统计量显示在DBA_TABLES视图内,包括下列内容:
这个表中的记录数 为这个表分配的存储块数(无论是否曾经被使用) 正在使用的存储块内的空闲空间大小 每条记录的平均长度 “链接”记录数(也就是被分割在两个或多个存储块内的记录,原因可能是记录过长或过小的存储设置)
除了这个表相关的整体统计量之外,还可以分析该表的每一列。列统计量显示在DBA_COLUMNS视图内,包括下列内容:
不同值的数目 最大值和最小值 NULL值的数目 平均列长度
分析某个表时,同时也会查看这个表的索引。索引统计量显示在DBA_INDEXES视图内,包括下列内容:
索引树的深度 不同键值的数目 聚合因子(记录的自然顺序与索引键顺序这间的接近程度)
还可以收集与索引相关的统计量。这些统计量显示在INDEX_STATS视图内,包括下列内容:
除了DBA_TABLES视图中的表统计量之外,分析某个表时还会收集DBA_INDEXES视图中的索引统计量以及DBA_COLUMNS视图中的列统计量。
1.2、收集统计量
对象统计量不是实时的,而是静态的。统计量的收集操作可以是自动的,也可以手动完成。使用ANALYZE命令或执行DBMS_STATS程序包中的过程能够手动收集统计量。
SQL> analyze table testtable compute statistics;
Table analyzed.
SQL> select num_rows from user_tables where table_name = 'TESTTABLE' ;
NUM_ROWS
----------
1
SQL> insert into testtable values ( 2 , 2 ) ;
1 row created.
SQL> select num_rows from user_tables where table_name = 'TESTTABLE' ;
NUM_ROWS
----------
1
SQL> analyze table testtable compute statistics;
Table analyzed.
SQL> select num_rows from user_tables where table_name = 'TESTTABLE' ;
NUM_ROWS
----------
2
SQL> insert into testtable values ( 3 , 3 ) ;
1 row created.
SQL> exec dbms_stats. gather_table_stats( 'TESTUSER' , 'TESTTABLE' ) ;
PL/ SQL procedure successfully completed.
SQL> select num_rows from user_tables where table_name = 'TESTTABLE' ;
NUM_ROWS
----------
3
与原有的ANALYZE命令相比,能够接受许多实参的DBMS_STATS过程更能影响统计量分析的深入程度。
2、性能指标
“统计量”与“指标”之间存在差异。统计量是一个原始数字,其本身可能无用。指标是一个经过转换变得有意义的统计量。
2.1、使用动态性能视图查看统计量
Oracle提供了大约三百个动态性能视图。它们的名称都有“V$”前缘,但这些视图根本不是视图,而是用于前缘为“V_$”的视图的同义词。
SQL> select object_name, object_type from all_objects
2 where object_name like 'V$%' or object_name like 'V_$%' ;
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
V$LOCK_TYPE SYNONYM
V_$RMAN_CONFIGURATION VIEW
V$RMAN_CONFIGURATION SYNONYM
V_$DATABASE_INCARNATION VIEW
V$DATABASE_INCARNATION SYNONYM
V_$METRIC VIEW
V$METRIC SYNONYM
V_$METRIC_HISTORY VIEW
V$METRIC_HISTORY SYNONYM
V_$SYSMETRIC VIEW
V$SYSMETRIC SYNONYM
动态性能视图填充了来自实例或控制文件的信息,前缘为DBA、ALL或USER的视图则填充了来自数据字典的信息。
动态性能视图在数据库启动阶段被创建,在指定实例的生存期内进行更新,在数据库关闭阶段被删除。动态性能视图通常提供的是统计量而非指标。
V$SYSSTAT给出了大约三百个统计量,这些统计量是监视活动的基础。
SQL> select name, value from v$sysstat;
NAME VALUE
-------------------------------------------- ----------
logons cumulative 82
logons current 16
opened cursors cumulative 20219
opened cursors current 50
user commits 202
user rollbacks 0
user calls 485
recursive calls 314286
recursive cpu usage 1237
session logical reads 155004
session stored procedure space 0
V$SYSTEM_WAIT_CLASS视图概述了可能导致会话或整个数据库运行缓慢的各种问题。
SQL> select wait_class, time_waited from v$system_wait_class
2 order by time_waited;
WAIT_CLASS TIME_WAITED
-------------------------------------------- -----------
Network 0
Application 0
Commit 57
Configuration 76
Concurrency 167
System I/ O 941
Other 1428
User I/ O 2166
Idle 2790066
9 rows selected.
可以看到最差情况是在实例接收到“Idle”事件时,“Idle”事件仅仅是一种事件(而不是问题),例如服务器进程等待接收来自用户进程的SQL语句。事实上,最大的问题是由用户会话导致的磁盘I/O,其次则是实例自身导致的磁盘I/O。