OCP认证考试指南(14):管理数据库性能(2)

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值