1.检查是否有锁表
查询锁表:select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_id=lck.trx_id and lck.blocked=1; --查询僵死会话
解锁:根据会话ID,停止会话
sp_close_session(sess_id);
2.根据v$sessions,V$LONG_EXEC_SQLS,确认sql是否需要优化
select * from v$sessions;--根据情况,可关闭执行卡死的会话。
查询系统访问用户是否过多:select count(1) from (select clnt_ip from v$sessions where create_time>'2021-07-20' group by clnt_ip)
会话数调整:达梦数据库修改最大连接数_江上一小白的博客-CSDN博客_达梦最大连接数
3.根据v$connect 确认连接数是否过高
select * from V$CONNECT where STATUS$='ACTIVE';--查询正在使用的连接
select ip_addr,count(1) from V$CONNECT group by ip_addr;--每个主机开启的连接数
select b.name,a.sql_text,a.clnt_ip from v$sessions a,V$CONNECT b where a.sess_id=b.saddr order by b.name, b.ip_addr;--每个链接对应的会话
4.根据DM性能监视工具-性能监视-资源监控-sql硬解析频率是否过高,运行参数配置是否合理
1 sql硬解析引起的并发数限制,可查询出访问次数较高的几个功能界面和执行率较
高的硬解析语句,优化功能的sql执行方式。
如:select * from test where id='123'; 改成 select * from test where id=? 方式执行。
或select para_value from V$DM_INI where para_name='USE_PLN_POOL';
如果已经开启sql日志功能( V$SQL_HISTORY),可查询出调用次数最多的sql,进行针对性优化:
select * from ( select regexp_replace(top_sql_text, '[''][[:print:]]*['']', '') sql1, count(1) cc from V$SQL_HISTORY group by regexp_replace(top_sql_text, '[''][[:print:]]*['']', '') ) order by cc desc--根据sql的调用次数降序排列
2 运行参数配置不合理,可修改配置
如查询:select * from V$DM_INI where para_name='HJ_BUF_GLOBAL_SIZE';
调整:alter system set 'HJ_BUF_GLOBAL_SIZE' =5000 both;
运行参数主要调整:
内存和会话数2方面,其中内存调整包括:内存池,缓冲区( 包括 SQL 缓冲池),排序区,哈希区4点。
运行内存配置可参考:达梦内存调整及修改方法_ITPUB博客
达梦数据库:性能参数优化篇 - 百度文库
5.检查系统资源
cup使用率、运行内存使用率,磁盘使用率,IO使用是否过高,是否使用的机械硬盘有坏道等,影响数据库运行。命令如: iftop(流量监控);top (Linux整体性能监控);iostat (IO监控)。
常用资源监控命令:Linux资源监控命令集合 - 百度文库
系统资源不足可升级硬件或部署达梦读写分离的集群模式,分摊压力。
架构图参见:达梦数据库监控
注:DM7版本事务控制期间insert,delete ,update过程中,引起的select卡慢,可升级到DM8版本解决。
6.检查表数据量是否存储的比较多
表数据过多引起的sql卡慢,可对存储数据量过多的表 分区 尝试解决,
对数据量巨多的可分表+多级分区联合使用解决查询卡慢的问题。
如:test表数据过多,根据登录账号的usernameid创建hash分区 (DM8_创建分区脚本)
CREATE TABLE "TEST_1"
(
"ID" VARCHAR2(32) NOT NULL,
"USERNAMEID" VARCHAR2(32),
"COLNAME1" VARCHAR2(199),
"COLNAME2" VARCHAR2(1) ) partition by hash (USERNAMEID) partitions 16 ;
alter table TEST rename to TEST_BAK;
alter table TEST_1 rename to TEST;
INSERT INTO TEST SELECT * FROM TEST_BAK;commit;
CREATE INDEX "TEST_USERNAMEID_COLNNAME1" ON TEST("USERNAMEID" ASC,"COLNAME1" ASC) GLOBAL ;--分区索引
alter table TEST enable row movement;--允许分区字段更新
7.查找出耗时的sql进行优化
1.通过试图查询历史执行的sql
select * from V$SQL_HISTORY where time_used>3000000 order by start_time desc;--查询出执行时间超过3s的sql;
select * from v$dm_ini where para_name='ENABLE_MONITOR';---查看是否开启
call sp_set_para_value(1,'ENABLE_MONITOR',1);--设置开启
2 若是sql_history未开启,可通过sql日志文件分析,历史执行的sql运行的情况
如:windows 系统查询耗时在10s以上的sql语句.
使用notepad++文本编辑器,打开达梦sql日志文件,ctrl+h打开搜索框输入正则查询
条件点击全部标记,可将耗时在10s以上的所有sql查询出来并标记;
点击搜索-书签->复制书签行,可以将标记的所有耗时在10s以上的sql拷贝出来。
linux 系统:查询耗时在10s以上的sql语句.
grep -n '[0-9]\{5,10\}[(][m][s][)]' /mnt/e/dmdbms/log/dmsql_DMSERVER_20220303_171739.log
输入以上命令可查询出耗时在10s以上的sql,
/mnt/e/dmdbms/log/dmsql_DMSERVER_20220303_171739.log :达梦sql日志所在路径。
'[0-9]\{5,10\}[(][m][s][)]' :正则查询条件