数据库性能分析及调整一例

数据|数据库|性能

故障现象
2004年6月8日上午10:00,内蒙古巴盟网通用户反映在OSS系统界面“话单查询”里查询单个用户五天的话单特别慢,查询很长时间无结果。

例如:在OSS系统界面“综合查询”内点击“收费”-〉“话单查询”,键入“用户号码,起始时间:2004-01-01 00:00:00,结束时间:2004-06-01 23:00:00”,点击查询后,IE进度条缓慢,很长时间不返回结果。
故障分析经过分析,此现象和数据库的性能有关,主要是数据库初始化参数调整不合理造成的性能低下。具体分析步骤如下:
1.首先查询话单表的索引是否失效,因为失效的索引会带来差的SQL查询效率。

SQL>select INDEX_NAME,status from USER_IND_PARTITIONS where status!='USABLE';

no rows selected.

结果说明没有失效的话单表索引。

 

2.用top命令看到可用物理内存很低,只剩下100M,有大量的SWAP区内存正在使用,ORACLE单个会话占用的内存很多,经查看ORACLE初始化参数shared_pool_size的值设置的过高,应重新调整。

top的结果:
last pid:  4565;  load averages:  0.15,  0.20,  0.20   
10:09:56

170 processes: 169 sleeping, 1 on cpu

CPU states: 84.9% idle,  1.6% user,  1.1% kernel, 12.4% iowait,  0.0% swap

Memory: 4096M real, 100M free, 1343M swap in use, 6851M swap free

 

  PID USERNAME THR PRI NICE  SIZE   RES STATE   TIME    CPU COMMAND

10459 oracle     1  59    0 1978M 1953M sleep   0:53  0.79% oracle

 2258 oracle     1  10    0 1976M 1951M sleep 116:57  0.65% oracle

25639 oracle     1  58    0 1975M 1949M sleep   1:56  0.27% oracle

 1948 oracle     1  58    0 1976M 1948M sleep   3:34  0.18% oracle

 4002 wacos      6  47    4 9616K 2344K sleep  27:26  0.18% cdr_backup

 2271 oracle     1  59    0 1975M 1947M sleep  15:13  0.16% oracle

 1958 oracle     1  48    0 1976M 1949M sleep   2:26  0.13% oracle

 1928 oracle     1  58    0 1976M 1951M sleep   4:28  0.12% oracle

 1926 oracle     1  58    0 1976M 1949M sleep   2:06  0.12% oracle

 1956 oracle     1  58    0 1976M 1949M sleep   2:23  0.11% oracle

 1952 oracle     1  59    0 1976M 1949M sleep   2:19  0.10% oracle

  403 root      10  21    0 4896K 4608K sleep  16:32  0.09% picld

 1954 oracle     1  48    0 1976M 1949M sleep   2:04  0.08% oracle

 2189 oracle     1  58    0 1976M 1949M sleep  15:51  0.08% oracle

 

3.为了进一步分析ORACLE的性能,用ORACLE自带的诊断工具statspack做性能快照分析,统计时段为1小时,时间从下午17:00-18:00之间。这段时间业务比较繁忙,选择在此时段内对整个系统进行性能分析,能够得到更加准确的信息。

安装statspack性能分析工具:

SQL>connect internal

SQL>alter system set timed_statistics=true;(收集操作系统的计时信息)

SQL>@?/rdbms/admin/spcreate.sql

SQL>execute statspack.snap   (17:00的时候运行一次)

SQL>execute statspack.snap   (18:00的时候运行一次)

SQL>@?/rdbms/admin/spreport  (产生性能分析报告)

 

截取报告的部分内容如下:

STATSPACK report for

 

DB Name         DB Id    Instance     Inst Num Release     OPS Host

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

ORCL          1000277484 ORCL                1 8.1.7.3.0   NO  bm_db1

 

                Snap Id     Snap Time      Sessions

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

 Begin Snap:                             1 08-Jun-04 17:00:15      116

   End Snap:                             2 08-Jun-04 18:00:40      116

    Elapsed:                              60.42 (mins)

 

Cache Sizes

~~~~~~~~~~~

           db_block_buffers:     180000          log_buffer:

   8192000

              db_block_size:       8192    shared_pool_size:

 314572800

 

Load Profile

~~~~~~~~~~~~                            Per Second       Per Transaction

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

                  Redo size:             11,005.01              2,280.39

              Logical reads:             65,704.21             13,614.83

              Block changes:                 67.96                 14.08

             Physical reads:              1,392.89                288.63

            Physical writes:                 11.61                  2.40

                 User calls:                172.63                 35.77

                     Parses:                 29.11                  6.03

                Hard parses:                  0.01                  0.00

                      Sorts:                  7.81                  1.62

                     Logons:                  0.14                  0.03

                   Executes:                101.44                 21.02

               Transactions:                  4.83

 

  % Blocks changed per Read:    0.10    Recursive Call %:               41.29

 Rollback per transaction %:    0.28       Rows per Sort:               25.55

 

Instance Efficiency Percentages (Target 100%)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Buffer Nowait %:  100.00       Redo NoWait %:              100.00

            Buffer  Hit   %:   97.88    In-memory Sort %:              100.00

            Library Hit   %:   99.98        Soft Parse %:               99.96

         Execute to Parse %:   71.30         Latch Hit %:               99.99

Parse CPU to Parse Elapsd %:   62.24     % Non-Parse CPU:               99.99

 

 Shared Pool Statistics        Begin   End

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

             Memory Usage %:   24.15   24.44

    % SQL with executions>1:   75.04   76.95

  % Memory for SQL w/exec>1:   75.49   79.90

 

Top 5 Wait Events

~~~~~~~~~~~~~~~~~                                             Wait     % Total

Event                                               Waits  Time (cs)   Wt Time

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

db file sequential read                         5,030,075      389,071   86.37

log file sync                                      17,470       21,187    4.70

log file parallel write                            17,640       18,611    4.13

db file parallel write                              1,853       14,930    3.31

db file scattered read                              3,149        2,297     .51

 

对报告分析后发现有一些不合理的初始化参数需要调整,建议如下调整:

1. 报告中发现全表扫描的语句特别多,因此建议程序中尽量避免使用全表扫描,

减少IO等待,从而加快语句的执行速度。

类似如下语句需要优化:

SQL>select count(*) as totalcount from LOCALUSAGE where se

rviceid=:"SYS_B_0" and starttime>=to_date(:"SYS_B_1",:"SYS_B_2")

 and starttime <=to_date(:"SYS_B_3",:"SYS_B_4") and ( LOCALROAMI

NGCHARGE >:"SYS_B_5"  or LocalCharge >:"SYS_B_6"  or UrbanCharge

 >:"SYS_B_7" or ruralcharge >:"SYS_B_8");

 

2.调整db_file_multiblock_read_count=16

这个参数指定一个完全连续扫描的一次I/O操作过程中读取的块的最大数量。它的增加对IO是有改善的,特别是在做full table scan的时候,可以减少IO的次数。

 

3.调整db_block_lru_latches=2

这个参数指定LRU 闩锁集数量的上限。LRU锁的数量是在Oracle数据库内部用来管理数据库缓冲的,它严重依赖于服务器上CPU的数量,这个值通常设置为服务器上cpu_count的一半,增大这个值有利于提高磁盘的I/O性能。

 

4.调整session_cached_cursors=200

这个参数指定要高速缓存的会话游标的数量,对同一SQL语句进行多次语法分析后,它的会话游标将被移到该会话的游标高速缓存中。增大这个值可以缩短语法分析的时间,因为游标被高速缓存,无需被重新打开。

 

5.调整log_buffer=1048576

参数log_buffer指定在 LGWR 将重做日志缓冲区里的内容写入重做日志文件之前,用于缓存这些条目的内存量。这个参数以字节为单位,同时受cpu_count的影响, log_buffer如果被设置得太高(例如,大于1MB),这会引起性能问题,因为大容量的结果会使得写入同步进行(例如,日志同步等待事件非常高)。

 

6.调整db_block_buffers = 200000  shared_pool_size= 262144000

按照杭州的规划,Oracle最终运行起来占用近1/2的物理内存。其中最主要的两个参数为:

db_block_buffers:它的配置原则是,最终数据块缓存占据1/3的内存。

Shared_pool_size:它的配置原则是,基本控制在200-500M左右。

 

7.从报告中发现系统等待最严重的五个事件为:db file sequential read,log file sync,log file parallel write,db file parallel write和db file scattered read.

(1)对于db file sequential read等待事件,一般问题出现在读索引上,建议将wacos表空间和wacos索引表空间分开存储在不同的物理卷下,以提高磁盘的I/O性能。

(2)对于db file scattered read等待事件,建议程序中尽量避免使用全表扫描的语句,或者可以增大db_file_multiblock_read_count的值,提高全表扫描一次读取数据块的速度,减少磁盘I/O。

(3)对于db file parallel write等待事件,说明DBWR进程正等待把缓冲区的内容并行写入数据文件中去,等待将一直持续到所有的I/O全部完成。建议增大初始化参数中的db_writer_processes的值,可以增大到4。
(4)对于log file sync等待事件,说明任何时候一个事物提交时,它将通知LGWR将LOG_BUFFER写入日志文件,如果此部分占用时间较长,应减少COMMIT的次数,建议将重做日志放到较快的磁盘上进行存储。
(5)对于log file parallel write等待事件,和上面一样建议将重做日志放到较快的磁盘上进行存储。   

故障处理
调整initORCL.ora里不合理的参数,具体调整为:

process=200

log_buffer=1048576

session_cached_cursors=200 

db_block_lru_latches=2

shared_pool_size= 262144000

db_block_buffers = 200000

sort_area_size = 6553600

sort_area_retained_size = 6553600

db_file_multiblock_read_count = 16

 
处理结果
调整完重启DB后,发现查询一切正常,很快就返回了结果。

总结数据库里初始化参数设置不合理, 内存富余太少, 导致数据库运行使用大量的swap空间,数据库性能很差,导致通过OSS界面查询话单很慢。这时需要通过调整数据库初始化参数解决该问题。从性能方面考虑,数据库服务器最好能富余300-500M以上的内存。

时间: 2024-10-31 10:03:05

数据库性能分析及调整一例的相关文章

15年老司机的DPM数据库性能分析产品研发之路

本文根据DBAplus社群第87期线上分享整理而成.   讲师介绍  邹德裕 轻维软件首席专家   DBAplus社群联合发起人,OraZ产品作者.Oracle OCM. 15年运维管理经验,在数据库诊断.故障排除.优化.架构设计等方面具有丰富的经验.   主题简介: 1.运维中常见的场景及对应解决案例 2.解密DPM数据库性能分析平台   本次我给大家带来的主题分享为<15年老司机的DPM数据库性能分析产品研发之路>.   我将通过Oracle在实际生产中常见的运维场景及问题处理案例,解析如

SQL中利用DMV进行数据库性能分析

相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级开发中,主要还是RMDB占据主导地位.并且在互联网项目中,也不是摒弃了RMDB,例如MySQL就在很多的互联网应用中发挥着作用.所以,对数据库的调优是个值得深入学习的课题.本系列文章,主要讲述与SQL Server相关的调优知识,希望能够为朋友们带来一些帮助. 本篇提纲如下: 传统SQL Serve

SQL2005性能分析一些细节功能你是否有用到?

原文:SQL2005性能分析一些细节功能你是否有用到?      我相信很多朋友对现在越来越大的数据量而感到苦恼,可是总要面对现实啊,包括本人在内的数据库菜鸟们在开发B/S程序时,往往只会关心自己的数据是否正确的查询出来,一旦自己写的程序哪天要花上十秒或者是一分种才会出来,此时就技穷了.如何优化成为菜鸟们的难题.本人不才,最近看了些园友关于数据库优化的文章,觉的有必要总结下,让更多像我一样只关心结果,并不关心质量的朋友少走些弯路.     本文主旨:本文并非大谈高深技术(也没这本事),只是想总结

sybase数据库性能调整

数据库性能调优的一些小方面: 1.1 性能指标 数据库性能一般用两个方面的指标来衡量:响应时间和吞吐量.响应越快,吞吐量越大,数据库性能越好.响应时间和吞吐量有些情况下不能一起得到改善. 1.2 调优级别 对Sybase数据库性能调优,可以从四个方面进行: 一) 操作系统级:对网络性能.操作系统参数.硬件性能等作改进. 二) SQL Server级:调整存取方法,改善内存管理和锁管理等. 三) 数据库设计级:采用降范式设计,合理设计索引,分布存放数据等. 四) 应用程序级:采用高效SQL语句,合

CloudDBA最佳实践-TOP SQL优化分析数据库性能问题

    云数据库CloudDBA诊断报告的TOP SQL优化是非常实用的功能,我们可以通过TOP SQL去诊断数据库中各种问题,比如性能出现下降,数据库压力出现波动,下面介绍两个线上生产案例.     一. 利用CloudDBA TOP SQL找出数据库规格升级而性能下降的元凶     最近在协助用户进行系统重构,RDS测试选型自然成为了本项目的一个重点,但是用户在测试不同规格的时候发现大规格的实例性能居然不如小规格,4C32G规格性能比8C64G规格高出10%,其性能监控也是非常的正常,4C3

《Oracle数据库性能优化方法论和最佳实践》——第2章 Oracle性能优化方法论的发展 2.1 基于局部命中率分析的优化方法论

第2章 Oracle性能优化方法论的发展 Oracle数据库在开发和使用过程中对数据库的性能优化极为重视,几乎在每个版本的更新中都会对可优化的数据库做出改善.不仅如此,Oracle数据库还会使用优化方法来指导性能优化,会不断推出新的性能优化方法论,并依据优化方法论持续完善其可观察的性能优化体系.从Oracle 6到现在的Oracle 12c,经历了Oracle 7.Oracle 8.Oracle 8i.Oracle 9i & R2.Oracle 10gR1 & R2.Oracle 11gR

dba_indexes视图的性能分析_数据库其它

select case when status='UNUSABLE' then 'alter index '||owner||'.'||index_name||' rebuild online compute statistics;' when to_number(degree)>1 then 'alter index /* '||degree ||' */'||owner||'.'||index_name||' noparallel;' end case from (select * from

性能分析工具的使用

 性能规划器的使用     性能规划器(Capacity Planner)是集成在Oracle 企业管理包(Oracle Enterprise Management Packs)中用来对反映系统性能的参数进行收集的工具,可以指定要收集的数据.收集数据的频率和数据装载到Oracle Capacity Planner历史记录数据库的时间.这样便于管理员对一定时间范围内的系统性能参数进行比较分析.    1. 性能规划器的设置    (1)在服务器的桌面选择[开始]/[程序]/[Oracle-OraH

SQL Server数据库性能的优化

server|数据|数据库|性能|优化 编者按:数据库性能优化和数据库管理系统密切相关,不同的数据库管理系统在具体操作上有很大不同.继本报连续在2003年第48期.49期上刊登<Sybase数据库性能调优>和<Oracle服务器性能调整攻略>,分别讨论了Sybase和Oracle数据库管理系统以后,本期我们将具体介绍SQL Server数据库的性能优化方法. 数据库是企业信息的核心,其应用水平的高低直接影响到企业管理水平.选择了一个高性能的数据库产品不等于就有一个好的数据库应用系统