十 管理数据库性能

    性能监视分为反应式(reactive)和前摄式(proactive)两种形式。其中,反应式意味着在出现某个问题的时候后之后执行某些动作;前摄式意味着成为问题之前标志未决的问题。显而易见,使问题对终端用户的影响最小化的理想方法是前摄式监视。

1、  无效的对象(PL/SQL对象和视图)

大多数PL/SQL对象都会引用表,如果某个PL/SQL对象引用的表在该PL/SQL对象的编译之后发生变化,那么这个过程会被标记为invalid

视图在创建时是有效的,但是在其所基于的表的定义发生变化时,视图就会失效。

Oracle总是会尝试自动编译无效的PL/SQL对象和视图,但是可能不会成功。如果不成功的话,就需要手动地进行编译(不过这个并不是必须的)。

1.1   标志无效的对象(PL/SQL对象和视图)

标志无效的对象(PL/SQL对象和视图)是自动的,使用DBA_OBJECTS视图来查询无效的对象。

sys@ORCL> select owner, object_name, object_type from dba_objects

  2  where status='INVALID';

 

OWNER                OBJECT_NAME                      OBJECT_TYPE

-------------------- -----------------------------------                      ------------

PUBLIC               DBA_HIST_FILESTATXS                 SYNONYM

PUBLIC               DBA_HIST_SQLSTAT                    SYNONYM

PUBLIC               DBA_HIST_SQLBIND                    SYNONYM

PUBLIC               DBA_HIST_SYSTEM_EVENT               SYNONYM

PUBLIC               DBA_HIST_WAITSTAT                   SYNONYM

PUBLIC               DBA_HIST_LATCH                      SYNONYM

PUBLIC               DBA_HIST_LATCH_MISSES_SUMMARY       SYNONYM

PUBLIC               DBA_HIST_DB_CACHE_ADVICE            SYNONYM

PUBLIC               DBA_HIST_ROWCACHE_SUMMARY           SYNONYM

PUBLIC               DBA_HIST_SGASTAT                    SYNONYM

PUBLIC               DBA_HIST_SYSSTAT                    SYNONYM

PUBLIC               DBA_HIST_SYS_TIME_MODEL             SYNONYM

PUBLIC               DBA_HIST_OSSTAT                     SYNONYM

PUBLIC               DBA_HIST_PARAMETER                  SYNONYM

PUBLIC               DBA_HIST_SEG_STAT                   SYNONYM

PUBLIC               DBA_HIST_ACTIVE_SESS_HISTORY        SYNONYM

PUBLIC               DBA_HIST_TABLESPACE_STAT            SYNONYM

PUBLIC               DBA_HIST_SERVICE_STAT               SYNONYM

PUBLIC               DBA_HIST_SERVICE_WAIT_CLASS         SYNONYM

已选择19行。

如果这个对象从未起过如何作用,也可能不需要,这样的话最好删除该对象。

1.2   修正无效的对象(PL/SQL对象和视图)

使用ALTER…COMPILE命令编译对象,如果失败,则用show errors来查看原因(视图不能使用这个命令),使用dba_dependencies视图来确定编译错误的原因。

编译对象:

Alter procedure hr.add_reg compile;

Alter view rname compile;

使用utlrp脚本可以编译所有无效的对象。

示例:

1、  搭建环境

sys@ORCL> conn system/123

已连接。

system@ORCL> create user testuser identified by testuser;

用户已创建。

system@ORCL> grant dba to testuser;

授权成功。

system@ORCL> conn testuser/testuser

已连接。

testuser@ORCL> create table testtab(n1 number, d1 date);

表已创建。

testuser@ORCL> insert into testtab values(1,sysdate);

已创建 1 行。

testuser@ORCL> create or replace view v1 as select d1 from testtab;

 

视图已创建。

 

testuser@ORCL> create or replace procedure p1 as

  2  cnt number;

  3  begin

  4  select count(*) into cnt from testtab;

  5  end;

  6  /

 

过程已创建。

2、  确认对象的状态

testuser@ORCL> select object_name, object_type, status from user_objects;

 

OBJECT_NAME                 OBJECT_TYPE                         STATUS

----------------------------------- ----------------------------------- -------

TESTTAB                      TABLE                               VALID

V1                           VIEW                                VALID

P1                           PROCEDURE                           VALID

3、  执行DDL命令

testuser@ORCL> alter table testtab drop column d1;

表已更改。

4、  重新确认对象的状态

testuser@ORCL> select object_name, object_type, status from user_objects;

OBJECT_NAME              OBJECT_TYPE            STATUS

----------------------------------- ----------------------------------- -------

TESTTAB                      TABLE                     VALID

V1                           VIEW                     INVALID

P1                         PROCEDURE                  INVALID

5、  重新编译指定的过程

testuser@ORCL> alter procedure p1 compile;

过程已更改。

6、  重新编译指定视图

testuser@ORCL> alter view v1 compile;

警告: 更改的视图带有编译错误。

7、  通过dba_dependenciesdba_views视图诊断,解决问题

testuser@ORCL> select referenced_name,referenced_owner,referenced_type

  2  from user_dependencies where name='V1';

 

REFERENCED_NAME      REFERENCED_OWNER          REFERENCED_TYPE

-------------------- ------------------------------ -----------------

TESTTAB              TESTUSER                       TABLE

D1                   TESTUSER                       NON-EXISTENT

D1                   PUBLIC                         NON-EXISTENT

testuser@ORCL> select text from user_views where view_name='V1';

 

TEXT

-----------------------------------------------------------------

 

select d1 from testtab

从上可以看出testtab少了d1列,对testtab表增加d1列,重新编译视图v1,就可以完成修复对象。

testuser@ORCL> alter table testtab add (d1 date);

 

表已更改。

 

testuser@ORCL> alter view v1 compile;

 

视图已变更。

2、  无用的索引

如果索引变得无用,就必须对索引进行显式的修复操作。

2.1 标志无用的索引

    如果某条语句试图使用一个无用的索引,取决于skip_unusable_indexes参数。若skip_unusable_indexestrue,则这条语句会重新使用不需要该索引的执行计划,其执行结果总会成功,但其效率已降低。若为否,则会返回错误消息。

检查变得无用的索引

Select owner, index_name from dba_indexes where status=’unusable’;

2.2 修正无用的索引

需要重建索引,重建索引需要额外的存储空间。

重建命令alter index…rebuild

对索引重建启用nologging,只是为索引重建禁用重做生成。在索引重建之后,针对该索引的索引dml命令都会生成重做。

示例:

1、  搭建环境

 testuser@ORCL> create index d1_inx on testtab(d1);

 

索引已创建。

 

testuser@ORCL> create index n1_inx on testtab(n1);

索引已创建。

2、  确认索引状态

testuser@ORCL> select index_name, status from user_indexes;

 

INDEX_NAME                     STATUS

------------------------------ --------

D1_INX                         VALID

N1_INX                         VALID

3、  对表进行改动,使索引无效

testuser@ORCL> alter table testtab move;

 

表已更改。

 

testuser@ORCL> select index_name, status from user_indexes;

 

INDEX_NAME                     STATUS

------------------------------ --------

D1_INX                         UNUSABLE

N1_INX                         UNUSABLE

4、  诊断和解决问题

testuser@ORCL> alter index n1_inx rebuild online nologging;

 

索引已更改。

 

testuser@ORCL> select index_name, status from user_indexes;

 

INDEX_NAME                     STATUS

------------------------------ --------

D1_INX                         UNUSABLE

N1_INX                         VALID----------索引已重建恢复有效

我们也可以使用database control工具修复,在这里不再讲述。

3、  优化器统计

优化器紧密依赖于一些统计量,从而能够评价众多可执行计划的效率以及选择某个执行计划。统计量的正确性至关重要。

统计与PL/SQL无关,只与SQL有关。

3.1 对象统计量

整体统计量dba_tables视图:

。表中的记录数

。为表分配的存储块数

。存储块内的空闲空间大小

。每条记录的平均长度

链接记录数

列统计量dba_columns

。不同值的数目

。最大值和最小值

NULL值的数目

。平均列长度

索引统计量dba_indexes

。索引树的深度

。不同键值的大小

。聚合因子

与索引相关的统计量index_stats

。引用现存记录的索引数

。引用被删除记录的索引数

维护索引的方式为:记录被删除时,保留索引键。

3.2 收集统计量

对象统计量不是实时的,而是静态的。因此必须有规律地收集统计量。统计量的收集操作可以是自动的,也可以是手动的。

使用database control 工具、analyze命令和dbms_stats程序包中的gather_table_stats过程能够手动收集统计量。

收集统计量能够改善性能,但是在进行分析期间会对性能造成显著地影响。

示例:

自动化统计量收集

创建调度作业

BEGIN

sys.dbms_scheduler.create_job(

job_name => '"TESTUSER"."ANALYZE TESTTAB"',

job_type => 'PLSQL_BLOCK',

job_action => 'BEGIN

   DBMS_STATS.GATHER_TABLE_STATS(ownname => ''TESTUSER'',

                                 tabname => ''TESTTAB'',

                                 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,

                                 method_opt => ''for all columns size repeat'',

                                degree => DBMS_STATS.AUTO_DEGREE,

                                 cascade=>TRUE

                                 );

END;',

start_date => systimestamp at time zone '+8:00',

job_class => 'DEFAULT_JOB_CLASS',

auto_drop => FALSE,

enabled => TRUE);

END;

使用database control工具执行调度作业一次

确认统计量是否收集:

testuser@ORCL> alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

 

会话已更改。

 

testuser@ORCL> select table_name, last_analyzed from dba_tables

  2  where wner='TESTUSER'

  3  union

  4  select index_name, last_analyzed from dba_indexes

  5  where wner='TESTUSER';

 

TABLE_NAME                     LAST_ANALYZED

------------------------------ -----------------

D1_INX                         25-04-12 14:37:40

N1_INX                         25-04-12 14:37:40

TESTTAB                        25-04-12 14:37:40

4、  性能指标

统计量与指标的区别:统计量是一个原始数字,其本身可能无用;指标是一个经过转换变得有意义的统计量。

4.1 使用动态视图查看统计量

动态性能视图填充了来自实例或控制文件的信息,实例被打开后就能被查询;前缀为DBAALLUSER的视图则填充了来自数据字典的信息,只有数据库被打开后才能查询。

动态视图在数据库启动阶段被创建,在指定实例的生存期内进行更新,在数据库关闭阶段被删除。动态视图通常提供的是统计量而非指标。

常用的动态视图:

V$sysstat:该视图有大约300个统计量,这些统计量是监视活动的基础。

v$system_wait_class:该视图概述了可能导致会话或整个数据库运行缓慢的各种原因。

4.2使用DATABASE CONTROL查看性能指标

    Database control接口将统计量转换成指标(metric).

4.3 与性能问题相关的指标

。运行队列的长度:指示服务器cpu资源的紧张程度。

。分页速度:在服务器内存不足的情况下会增加。

。正在等待的数据库会话数及其原因。

。每秒钟的登陆与事务数。

。物理读取数以及每秒生成的重做量。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-722227/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9537053/viewspace-722227/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值