一、数据库性能问题的背景
随着业务数据规模持续增长并进入海量数据阶段,系统在瞬时高并发场景下对数据库造成明显冲击,当前数据库压力主要表现为 TPS、QPS 长期高位运行、日志写入频繁以及热块读突出,尤其是索引热块读问题较为严重。在日常数据库操作中,性能问题通常是由各种因素引起的。这些因素可能来自数据库的硬件资源限制,也可能与 SQL 查询的执行计划相关。以下是一些常见的数据库性能问题:
1、运行态问题
运行态问题通常与 SQL 执行计划相关。若数据库优化器生成了非最优的执行计划,SQL 请求可能会扫描大量数据,导致性能低下。此外,计划缓存命中率不高也会增加 SQL 执行的编译时间。运行态问题可以通过调整执行计划来解决。
2、阻塞态问题
数据库的工作线程在进行 CPU 计算或等待某些资源时,可能进入阻塞态。阻塞态表明系统的并发能力受限,无法通过增加资源提升吞吐量。解决阻塞态问题的首要步骤是识别阻塞点,并进行针对性优化。
二、数据库性能优化的目标
根据不同角色的需求,数据库优化的目标各有不同:
三、数据库优化的关键指标
优化数据库性能时,以下几个关键指标是必须关注的:
四、性能问题的定位
性能问题的定位需要收集大量的系统信息,包括硬件资源使用情况、数据库软件配置、SQL 执行状况等。
4.慢SQL和阻塞监控
(1)已执行超过2秒的活动 SQL
select * from
(
SELECT
user_name ,
clnt_ip ,
sess_id ,
sql_text ,
datediff(ss, last_send_time, sysdate) ss,
SF_GET_SESSION_SQL(SESS_ID) fullsql
FROM
V$SESSIONS
WHERE
STATE='ACTIVE' and user_name!='SYSDBA'
)
where ss>=2 order by 5 desc;
(2)锁超时查询阻塞会话
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;
(3)查询死锁历史事务信息
select
dh.trx_id ,
sh.sess_id,
wm_concat(top_sql_text)
from
V$DEADLOCK_HISTORY dh,
V$SQL_HISTORY sh
where
dh.trx_id =sh.trx_id
and dh.sess_id=sh.sess_id
group by
dh.trx_id, sh.sess_id;
(4)开启SQL日志sqllog
--设置 SQL 过滤规则,只记录必要的 SQL,生产环境不要设成1
2 只记录 DML 语句
3 只记录 DDL 语句
22 记录绑定参数的语句
25 记录 SQL 语句和它的执行时间
28 记录 SQL 语句绑定的参数信息
SELECT SF_SET_SYSTEM_PARA_VALUE('SQL_TRACE_MASK','2:3:22:25:28',0,1);
--同步日志会严重影响系统效率,生产环境必须设置为异步日志
SELECT SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_ASYNC_FLUSH',1,0,1);
--下面这个语句设置只记录执行时间超过 200ms 的语句
SELECT SF_SET_SYSTEM_PARA_VALUE('SVR_LOG_MIN_EXEC_TIME',200,0,1);
--下面的语句查看设置是否生效
SELECT * FROM V$DM_INI where para_name='SVR_LOG_ASYNC_FLUSH';
SELECT * FROM V$DM_INI where para_name='SQL_TRACE_MASK';
SELECT * FROM V$DM_INI where para_name='SVR_LOG_MIN_EXEC_TIME';
--开启 SQL 日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 1);
--关闭 SQL 日志:
SP_SET_PARA_VALUE(1, 'SVR_LOG', 0);
五、常见的性能优化方法
达梦ET默认未启用,设置启动以下三个参数可以启用ET(ENABLE_MONITOR、MONITOR_TIME和MONITOR_SQL_EXEC);
其中,ENABLE_MONITOR和MONITOR_TIME默认已开启,如果未开启可以使用如下方法开启:
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
MONITOR_SQL_EXEC为会话级动态参数,可以设置只针对当前会话开启:
SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
执行SQL语句,我们会看到一个执行号,直接点这个执行号,即可调用ET;
在知道执行号的情况下,CALL ET(124571);
--全库级别
CALL SP_DB_STAT_INIT (); --对库上所有表及索引 生成统计信息
--收集shema统计信息
CALL DBMS_STATS.GATHER_SCHEMA_STATS('大写的用户名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
--收集表的统计信息
CALL DBMS_STATS.GATHER_TABLE_STATS('大写的用户名', '大写的表名',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
--收集索引的统计信息
DBMS_STATS.GATHER_INDEX_STATS('username','IDX_T2_X');
文章
阅读量
获赞
