当前位置:数据库 > SQLServer >>

数据库性能检查指导方案 - Part II

答案:
    存储性能评估

在存储性能评估的时候,我们使用磁盘性能指数(DPI, Disk Performance Index),下表列出了DPI中的各项指数,这个评分系统并不意味着对磁盘的使用和分配的全方位评估,而只是代表一个晴雨表,反映当前磁盘的使用和分配上是否存在需要改进或者注意的地方。

 

MPI指数

分类

所需等级

最高分

调整表和索引



30

表的行连接问题



30

分离关键的Oracle文件



30

回滚段的平衡

 

30

临时段的平衡

 

30

使用最多的前10个SQL的磁盘使用率

<5%

60

是否已经调整使用磁盘最多的前25个SQL



40

MPI指数

总分

250

 

1. 调整表和索引

由于表和索引的数据块通常是被同时读取的,所以应该尽量将表和其相关联的索引放置在不同的磁盘上,以便减少文件的I/O冲突。

 

检查方法:

select i.index_name, t.table_name, t.tablespace_name
  from user_tables t, user_indexes i
 where t.table_name = i.table_name
   and t.tablespace_name = i.tablespace_name;

 

返回结果是创建在相同表空间中的表和相关联的索引。建议创建新的表空间用于专门存放索引,并将当前的索引rebuild到新创建的表空间中。

alter index idx_name rebuild tablespace ts_name;

评估准则:

等级

分数

表和索引放在同一磁盘上

0

存储使用了磁盘阵列,没有进一步调整

20

存储使用了磁盘阵列,对于RAID类型已经作过调整

30

表和索引已经规划在不同磁盘上

30

 

2. 表的行链接问题

当更新一张表,而数据块中又没有足够的剩余空间来容纳所作的修改时,就会发生“行链接”现象,该记录被链接到另外一个有足够空间的数据块中,也就是一条记录跨越了多个数据块,这样在读取该记录的时候就会消耗更多的I/O,当数据库中有大量的“行链接”现象存在时,数据库的整体性能就会下降。

 

检查方法:

sqlplus /nolog

connect app_user/password

SQL> @$ORACLE_HOME/rdbms/admin/utlchain.sql

SQL> analyze table <table_name> list chained rows;

SQL> select count(*) chained_rows, table_name
  from chained_rows
 group by table_name;

 

如果没有返回任何行,则表示没有“行链接”现象。否则将按照已经分析过的表显示每张表中有多少记录出现了“行链接”现象。

“行链接”现象的产生跟PCTFREE参数的设置不当有关系。PCTFREE值默认为10%,如果系统中存在大量行链接,表示这个参数指定的块保留空间过小,不足以容纳块中所有记录的更新操作。此时应该增大相应表的PCTFREE值。

 

评估准则:

等级

分数

存在行链接现象

0

不存在行链接现象

30

 

3. 分离关键的Oracle文件

无论是出于安全性的考虑还是性能的考虑,都建议将关键的Oracle文件分布在可用的独立磁盘上。

首先在错误出现之后,用来被恢复的数据文件和用来恢复的控制文件,重作日志文件,归档日志文件应该分离存放。如果有可能,将下列各个关键文件分布在不同的磁盘上。

系统表空间(SYSTEM),临时表空间(TEMP),回滚表空间(UNDO),联机重作日志文件(REDO)和归档日志文件(ARCH),经常访问的用户表空间,经常访问的用户索引表空间,操作系统盘,$ORACL_EBASE中的关键Oracle软件文件。

至少联机重作日志文件(REDO)和归档日志文件(ARCH)应该跟其它文件存放在不同的磁盘上,并且由于日志文件的大部分时间为只写属性,所以需要考虑RAID5在写方面的弱势,尽量不要将日志文件存放在RAID5的阵列组上。

 

检查方法:

select file_name, tablespace_name, bytes
  from dba_data_files
union all
select file_name, tablespace_name, bytes
  from dba_temp_files
union all
select name file_name, NULL, NULL
  from v$controlfile
union all
select member file_name, to_char(a.group#) tablespace_name, b.bytes bytes
  from v$logfile a, v$log b
 where a.group# = b.group#
union all (select value file_name, NULL, NULL
             from v$parameter
            where name like 'log_archive_dest_%'
              and value is not null
           minus
           select value file_name, NULL, NULL
             from v$parameter
            where name like 'log_archive_dest_state%');

 

返回数据库中所有关键文件存储的位置,由DBA和SA考察返回的结果,确认已经对于关键文件的存储位置作过符合实际情况的调整。

 

评估准则:

等级

分数

没有调整,全部在单个磁盘上

0

没有调整,全部在RAID上

20

已经调整

30

 

4. 回滚段的平衡

在Oracle 9i和Oracle9i之前如果没有使用回滚段自动管理,那么对于回滚段的性能仍然是需要监控并且调整的。

 

检查是否使用了回滚段自动管理:

select name, value from v$parameter where name like '%undo_%';

 

如果返回结果中undo_management的值是AUTO,则表示使用了回滚段自动管理,同时undo_tablespace值显示了自动管理使用的回滚表空间,undo_retention值显示了在回滚表空间中保留回滚数据的时限,以秒为单位。

注意:如果undo_management的值是AUTO但是undo_tablespace没有设置相应的值,那么就会使用SYSTEM表空间中的SYSTEM回滚段,这个是绝对应该避免的现象。

 

如果没有使用回滚段自动管理,那么需要监控用户使用回滚段的频度,原则上认为不应该有超过1个用户同时使用1个回滚段。

 

检查方法:

select a.name,
       b.extents,
       b.rssize,
       b.xacts,
       b.waits,
       b.gets,
       optsize,
       status
  from v$rollname a, v$rollstat b
 where a.usn = b.usn;

 

检查输出结果,对于所有回滚段而言,如果xacts(活动事务)和waits(段头等待)经常超出1,那么就表明需要增加回滚段数目,以避免可能出现的争用。

增加回滚段的方法:

create rollback segment rs_name tablespace RBS storage(initial 1M next 2M);
alter rollback segment rs_name online;

 

如果使用了回滚段自动管理,那么可以从v$undostat, v$rollstat, dba_undo_extents等视图中查询当前回滚段的使用和分配情况。

 

评估准则:

等级

分数

有回滚段等待现象

0

无回滚段等待现象

30

使用了回滚段自动管理

30

 

5. 临时段的平衡

当初始化参数中定义的SORT_AREA_SIZE大小无法满足排序要求的空间,就会使用临时表空间中的临时段进行排序,磁盘排序比内存排序要慢100-10000倍,所以尽量减少磁盘排序是性能调整工作的一个重要部分。

可能引起排序的操作有create index, distinct, order by, group by等。

 

检查方法:

select name, value from v$sysstat where name like '%sorts%';

 

返回结果中的sorts (memory)表示内存排序,而sorts (disk)则表示磁盘排序,如果存在大量的磁盘排序,则表明我们需要增加SORT_AREA_SIZE或者HASH_AREA_SIZE等排序区的大小,或者需要检查目前系统中消耗大量磁盘的SQL是否已经经过调整(检查前25位消耗磁盘的SQL在后面部分将提到)。

 

检查使用磁盘排序的会话信息,可以定位执行了大量磁盘排序的会话。

检查方法:

select b.name, a.sid, a.value
  from v$sesstat a, v$statname b
 where a.STATISTIC# = b.STATISTIC#
   and b.name = 'sorts (disk)'
   and a.value > 0
 order by a.value desc;

如果有可能我们应该将临时表空间中的多个临时数据文件分布在不同的磁盘上,以减少排序时可能会产生的磁盘冲突。

在Oracle9i中,我们可以设置PGA_AGGREGATE_SIZE初始化参数来指定所有会话将使用的PGA大小,同时也必须设置WORKAR

上一个:本人用foxpro写的房屋产权产籍管理系统
下一个:昨天到安徽宿松一个客户那里搞维护的经验教训

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,