前言
   
遇到数据库性能问题,一般从以下几个方面分析
    
    
    一、操作系统
   
在操作系统层面主要从以下几个方面入手
    
    
    1. cpu
   
    可使用top命令查看cpu使用率
    
    这里主要查看DMSERVER 的CPU使用情况
    
    
    
    另一方面看USR/SYS的使用率,如果比较高的话也需要注意一下
   
    
    
    2.磁盘I/O
   
    使用iostat命令查看磁盘I/O使用情况
    
    
    
    我们需要关注util%,如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈,这个时候需要关注一下对应的rkB/s和wkB/s,在200M左右最好,如果太低可能达不到数据盘的要求。
   
    
     提示:%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
    
也可以使用dstat工具,更直观,可以收集CPU/IO/NET信息,但它的弊端是不能区分设备
     
   
    
    
    3.内存
   
使用free命令查看内存使用情况
free -m
    
    
    关注服务器剩余可用内存(free列),另外还需要关注磁盘缓存(buff/cache 列)
   
    
    
    4.nmon
   
    使用nmon工具监控系统一段时间的整体情况
    
    输入c代表cpu,m代表Memory,d代表磁盘io,n代表network,可以全部显示
    
     
   
打印nmon结果集
nmon -s 2  -c 300 -F xxx.nmon
    
     注:每2秒采集一次,总共采集300次
    
    
    
    5.perf top
   
    使用perf top命令查看系统热点情况
    
    perf top会生成函数调用热力图,来判断哪些函数占用大量的cpu时间
   
[root@localhost ~]# perf top -e cpu-clock
    
    
    
     分析:如果发现数据库主机的cpu、I/O、内存等使用率很高,往往说明数据库存在性能瓶颈。也可能是硬件本身存在问题,但这种可能性比较小,也容易排除
    
    
    
    二、实例
   
    
    
    1.数据库架构
   
确认数据库架构是否最优
    
    
    2.INI参数优化
   
配置对应INI优化参数
    
    
    3.数据库会话监控
   
可使用下面的sql监控数据库状态
--查询活动会话数
select count(*) from v$sessions where state='ACTIVE';
--已执行超过2秒的活动SQL
select * from (
SELECT sess_id,sql_text,datediff(ss,last_send_time,sysdate) Y_EXETIME,
       SF_GET_SESSION_SQL(SESS_ID) fullsql,clnt_ip
 FROM V$SESSIONS WHERE STATE='ACTIVE')
 where Y_EXETIME>=2;
--锁查询
select o.name,l.* from v$lock l,sysobjects o where l.table_id=o.id and blocked=1
--阻塞查询
with locks as(
  select o.name,l.*,s.sess_id,s.sql_text,s.clnt_ip,s.last_send_time  from v$lock l,sysobjects o,v$sessions s
  where l.table_id=o.id and l.trx_id=s.trx_id ),
 lock_tr as (   select trx_id wt_trxid,row_idx blk_trxid from locks where blocked=1),
 res as(    select sysdate stattime,t1.name,t1.sess_id wt_sessid,s.wt_trxid,
     t2.sess_id blk_sessid,s.blk_trxid,t2.clnt_ip,SF_GET_SESSION_SQL(t1.sess_id) fulsql,
     datediff(ss,t1.last_send_time,sysdate) ss,t1.sql_text wt_sql  from lock_tr s,locks t1,locks t2
    where t1.ltype='OBJECT'  and t1.table_id<>0   and t2.ltype='OBJECT'  and t2.table_id<>0
     and s.wt_trxid=t1.trx_id  and s.blk_trxid=t2.trx_id)
select distinct wt_sql,clnt_ip,ss,wt_trxid,blk_trxid  from res;
    
    
    三、SQL
   
    
    
    1.生成sqllog
   
开启sql日志功能
--sqllog.ini 配置示例  
[SLOG_ALL]
    FILE_PATH    = ..\log
    PART_STOR    = 0
    SWITCH_MODE  = 2
    SWITCH_LIMIT   = 512
    ASYNC_FLUSH   = 1
    FILE_NUM = 4
    ITEMS    = 0 
    SQL_TRACE_MASK  =  2:3:22:25:28 
    MIN_EXEC_TIME = 100 
    USER_MODE   = 0 
    USERS =
    
    
    
    2.sql汇总分析
   
使用日志转换工具生成sql汇总
    
    
    3.确定目标sql
   
对于高并发sql,思路是单个SQL调到最快以及优化应用,减少执行次数
对于一般并发sql,思路是使用索引优化,改写sql
    
    
    4.sql性能分析工具
   
ET是DM自带的分析工具,能统计SQL每个操作符的时间花费,从而定位到有性能问题的操作,指导用户去优化
    
    
    总结
   
以上就是dm数据库性能优化思路
达梦技术社区:https://eco.dameng.com
 
