达梦数据库性能问题排查思路/查看锁/锁等待/查看索引/删除创建索引/统计信息收集

已邀请:

1、查看当前的等待,wait_for_id就是大家在等着的ID

select * from v$trxwait

/uploads/files_user1/answer/5ef013c21ad03335006.png

2、查看被等待的ID正在做什么

select sess_id,SQL_TEXT,CLNT_IP from v$sessions where trx_id='wait_for_id';



综合以上2个sql

select sess_id,SQL_TEXT,trx_id,CLNT_IP from v$sessions where sess_id in (select sess_id from v$trx where ID in (select wait_for_id from v$trxwait));



3、如果有阻塞或死锁的session可以通过查询他的sess_id,然后杀掉

SP_CLOSE_SESSION(sess_id)


1、查看慢sql的执行计划

explain for update fa_log set ts=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),redep_flag = 'Y' where log_type = '1' and pk_accbook = '1001A110000000000JCB' and accyear = '2019' and period = '01' and pk_org = '0001A11000000000969Z';

2、查看表当前的索引

select * from user_ind_columns where table_name = upper('fa_log');

3、删除已有的索引,例如要新加入一个log_type字段

drop index I_FA_LOG_2;

4、创建新索引

CREATE INDEX I_FA_LOG_2 ON FA_LOG(ACCYEAR,PERIOD,PK_ACCBOOK,PK_ORG,LOG_TYPE);


1、查看被block线程

SELECT O.NAME,L.* FROM V$LOCK L,SYSOBJECTS O WHERE L.TABLE_ID=O.ID AND BLOCKED=1;

2、查询阻塞事务及被阻塞事务ID

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 SYSDATE STAT_TIME, '0X'||TRIM(TO_CHAR(WT_SESSID,RPAD('X',15,'X'))) WT_SESSID,
       '0X'||TRIM(TO_CHAR(BLK_SESSID,RPAD('X',15,'X'))) BLK_SESSID,
       CLNT_IP,WT_TRXID,BLK_TRXID,SS,WT_SQL
FROM RES ORDER BY SS DESC;


1、启、停SQL日志:
sp_set_para_value(1,'SVR_LOG',1); ---开启SQL日志
sp_set_para_value(1,'SVR_LOG',0); ---关闭SQL日志

--返回执行耗时大于2秒的语句
select * from (SELECT sess_id,sql_text,state,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>=2;


达梦数据库统计信息的使用

1、更新统计信息

----更新统计信息(模式T11下的所有对象)
dbms_stats.GATHER_SCHEMA_stats ('T11');
----更新统计信息(模式T11下的表T11)
dbms_stats.GATHER_TABLE_STATS ('T11','T11');

DBMS_STATS.GATHER_TABLE_STATS('JG_BJLS_1121','BD_ACCASOA',null,100,TRUE,'FOR ALL COLUMNS SIZE 1')

----更新统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.GATHER_INDEX_STATS('T11','IDX_T11_ID');


2、查看统计信息 

----查看统计信息(模式T11下的表T11)
dbms_stats.TABLE_STATS_SHOW('T11','T11');
----查看统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.INDEX_STATS_SHOW('T11','IDX_T11_ID');
----查看统计信息(模式T11下的表T11下的列ID)

dbms_stats.COLUMN_STATS_SHOW('T11','T11','ID');


3、删除统计信息

----删除统计信息(模式T11下)
dbms_stats.DELETE_SCHEMA_STATS('T11','T11');
----删除统计信息(模式T11下的表T11)
dbms_stats.DELETE_TABLE_STATS('T11','T11');
----删除统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.DDELETE_INDEX_STATS('T11','IDX_T11_ID');
----删除统计信息(模式T11下的表T11下的列ID)

dbms_stats.DELETE_COLUMN_STATS('T11','T11','ID');


4、更新统计信息

----更新已有的统计信息

dbms_stats.UPDATE_ALL_STATS() 

查看是否有资源等待:

select * from v$trxwait connect by id = prior wait_for_id;


查看阻塞会话及相关信息:

SELECT * FROM(select thrd_id,trx_id,sf_get_session_sql(sess_id),datediff(ss,sysdate,last_recv_time) ss,sql_text from v$sessions where state = 'ACTIVE' order by ss)S,(select * from v$lock where lmode like '%X%') LWHERE S.TRX_ID = L.TRX_ID ORDER BY SS DESC;select datediff(ss,sysdate,last_send_time) a, SF_GET_SESSION_SQL(SESS_ID) ,

--获取完整sql sess_id ,sess_seq ,sql_text , state ,seq_no , user_name ,trx_id ,create_time, clnt_ip from v$sessions where state='ACTIVE' and sess_id != sessid order by a;

--未提交查询

select b.object_name,c.sess_id,a.* from v$lock a,dba_objects b,v$sessions cwhere a.table_id=b.object_idand ltype='OBJECT'and a.trx_id=c.trx_id; 


查看被锁会话相关情况:

select * from v$lock where trx_id in (select trx_id from v$sessions where state = 'ACTIVE' order by ss) and blocked = 1 order by lmode desc;


和用户确认后,关闭严重影响性能的会话:

sp_close_session()


清空执行缓存信息CALL SP_CLEAR_PLAN_CACHE(); 



收集模式的统计信息

 DBMS_STATS.GATHER_SCHEMA_STATS('模式名',100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); 

 注:如果数据量较大,该过程可能较慢,请耐心等待。


 收集表的统计信息 

 DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');


检查内存RECYCLE使用情况

select sum(free) from v$bufferpool where name = 'RECYCLE'

http://eco.dameng.com/docs/zh-cn/start/ 云适配中心网址,可以先了解一下,有技术材料和资源申请,也有论坛答疑

SP_CREATE_SYSTEM_PACKAGES(1);
--收集模式下所有列统计信息,以AAAAAAA模式为例
DBMS_STATS.GATHER_SCHEMA_STATS('AAAAAAA',100,FALSE, 'FOR ALL COLUMNS SIZE AUTO');
--收集模式下所有索引统计信息,以AAAAAAA模式为例
DBMS_STATS.GATHER_SCHEMA_STATS('AAAAAAA',100,FALSE, 'FOR ALL INDEXED SIZE AUTO');



#如果是当前用户登录,那就直接执行如下即可:

SP_CREATE_SYSTEM_PACKAGES(1);DBMS_STATS.GATHER_SCHEMA_STATS(user,100,FALSE, 'FOR ALL COLUMNS SIZE AUTO');DBMS_STATS.GATHER_SCHEMA_STATS(user,100,FALSE, 'FOR ALL INDEXED SIZE AUTO');



要回复问题请先登录注册