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][)]'   :正则查询条件

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐