前言:
达梦数据库性能诊断与调优是一个复杂的过程,需要综合考虑多个方面。以下是一些建议和步骤,供您参考:(下列建议与步骤来自AI生成的方法策略)
- 明确目标:根据角色的不同,数据库优化分为以下几个目标:业务角度(用户):减少用户页面响应时间;数据库角度(开发):减少数据库 SQL 响应时间;数据库服务器角度(运维):充分使用数据库服务器物理资源减少数据库服务器 CPU 使用率,减少数据库服务器 IO 使用率,减少数据库服务器内存使用率。
- 收集现场信息:这包括数据库硬件信息、数据库软件信息以及数据库用户信息。
- 问题定位:可以通过动态视图+SQL 日志+JDBC 驱动日志来进行性能问题定位。
- 硬件资源检查:检查硬件资源是否达到瓶颈或出现故障,如网络不稳定丢包、存储设备故障导致IO异常等。
- 数据物理一致性检查:在数据库服务器正常关闭的情况下,可以使用工具对数据文件完整性进行校验,检验的内容主要包括:数据文件大小的校验;索引合法性校验;数据页面校验;系统对象 ID 校验等。
- 调整配置参数:在达梦数据库中,很多参数都是动态的,会自动响应各种负载,但DBA仍然可以调用系统过程来改变达梦实例的运行参数,从而获得更佳的性能体验。
- SQL层面诊断与调优:这包括慢SQL、执行计划、索引、统计信息、表设计等层面的分析和优化。
- 操作系统层面相关排查:例如使用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:待完善