达梦数据库性能诊断与调优

前言:

达梦数据库性能诊断与调优是一个复杂的过程,需要综合考虑多个方面。以下是一些建议和步骤,供您参考:(下列建议与步骤来自AI生成的方法策略)

  1. 明确目标:根据角色的不同,数据库优化分为以下几个目标:业务角度(用户):减少用户页面响应时间;数据库角度(开发):减少数据库 SQL 响应时间;数据库服务器角度(运维):充分使用数据库服务器物理资源减少数据库服务器 CPU 使用率,减少数据库服务器 IO 使用率,减少数据库服务器内存使用率。
  2. 收集现场信息:这包括数据库硬件信息、数据库软件信息以及数据库用户信息。
  3. 问题定位:可以通过动态视图+SQL 日志+JDBC 驱动日志来进行性能问题定位。
  4. 硬件资源检查:检查硬件资源是否达到瓶颈或出现故障,如网络不稳定丢包、存储设备故障导致IO异常等。
  5. 数据物理一致性检查:在数据库服务器正常关闭的情况下,可以使用工具对数据文件完整性进行校验,检验的内容主要包括:数据文件大小的校验;索引合法性校验;数据页面校验;系统对象 ID 校验等。
  6. 调整配置参数:在达梦数据库中,很多参数都是动态的,会自动响应各种负载,但DBA仍然可以调用系统过程来改变达梦实例的运行参数,从而获得更佳的性能体验。
  7. SQL层面诊断与调优:这包括慢SQL、执行计划、索引、统计信息、表设计等层面的分析和优化。
  8. 操作系统层面相关排查:例如使用top命令查看cpu使用率,使用iostat命令查看磁盘I/O使用情况等。

基于上述策略:达梦数据库性能诊断与调优可以从下面三大块来分析

一、查询优化基本思路

数据库性能问题通常可从三个方面分析:操作系统(内存、CPU、I/O等)、实例(数据库架构、INI参数等)、SQL(性能、sql日志)

A、操作系统性性能诊断方面

可以通过LINUX常用性能监控命令来分析:

1、top命令查看cpu使用率

2、iostat命令查看磁盘I/0使用情况

3、dstat工具查看磁盘I/0使用情况

4、free命令查看内存使用情况使用nmon工具监控系统一段时间的整体情况

5、perf top命令查看系统热点情况

分析:如果发现数据库主机的cpu、I/0、内存等使用率很高,往往说明数据库存在性能瓶颈。也可能是硬件本身存在问题,但这种可能性比较小,也容易排除

B、数据库实例方面

1、数据库架构优化

对于海量数据库分析业务可以使用MMP集群

对于高并发事务型业务可以由单机转换为读写分离集群

2、数据库参数优化

参数优化比较灵活,也依赖于服务器的配置

3、数据库会话监控

a、查询活动会话数

select count(*) from v$sessions where state='ACTIVE';

b、已执行超过多长时间的活动SQL

例子:查询超过3秒的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>=3;

c、锁查询

select t2.name,
       t1.*
  from v$lock t1, 
       sysobjects t2
 where t1.table_id=t2.id 
   and blocked=1;

d、阻塞查询

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 as stattime,
             t1.name,
             t1.sess_id as wt_sessid,
             s.wt_trxid,
             t2.sess_id as blk_sessid,
             s.blk_trxid,
             t2.clnt_ip,
             SF_GET_SESSiON_SQL(t1.sess_id) as fulsql,
             datediff(ss,t1.last_send_time,sysdate) as ss,
             t1.sql_text as wt_sql
        from lock_tr as s,
             locks t1,
             locks t2
       where t1.ltype='0BJECT'
         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;

4、SQL优化

处理流程:生成日志-》日志入库-》分析SQL-》优化方案

SQL优化思路

对于高并发SQL:单个sql调到最快(索引解决)、优化应用来减少执行次数

对于一般并发SQL:使用索引、改写sql(避免索引失效无法命中,提前过滤、使用分析函数减少表扫描)

二、执行计划详解

什么是执行计划:执行计划就是一个sql语句在数据库中执行过程的描述,使用explain+sql语句就可以看到sql执行计划,执行计划由若干个节点组成,每个节点由操作符+它的代价等信息组成(如CSCN2:[1,7999,1233],意思是该节点SCCN2全表扫描,代价估算是1ms,扫描的记录行数是7999行,输出的字节数1233个)

A、常用操作符解读

NSET:收集结果集

PRJT:投影

SLCT:选择

AAGR:简单聚集

FAGR:快速聚集

HAGR:HASH分组聚集

SAGR:流分组聚集

BLKUP:二次扫描

CSCN:全表扫描

索引扫描:SSEK   、CSEK、SSCN

B、嵌套循环连接

NEST LOOP原理:

#两层嵌套循环结构,有驱动表和被驱动表之分。

选定一张表作为驱动表,遍历驱动表中的每一行,根据连接条件去匹配第二张表中的行。驱动表的行数就是循环的次数,这个很大程度影响了执行效率
需注意的问题:
#选择小表作为驱动表。统计信息尽量准确,保证优化器选对驱动表-大量的随机读。如果没有索引,随机读很致命,每次循环只能读一块,不能读多块。使用索引可以解决这个问题。
使用场景:
#驱动表有很好的过滤条件
#表连接条件能使用索引
#结果集比较小

C、哈希连接

D、排序合并连接

E、查询转换

三、索引与统计信息详情

概述:统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息。比如,表的行数,块数,平均每行的大小,索引的高度、叶子节点数,索引字段的行数,不同值的大小等,都属于统计信息。

A、统计信息

B、索引存储结构

C、创建索引的原则

D、不走索引的情况

E、索引对DML语句的影响

ps:待完善

想要了解更多:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

你可能感兴趣的:(数据库)