为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM7
【操作系统】:
【CPU】:
【问题描述】*:
我使用--查询被阻塞的信息和引起阻塞的信息
select sysdate stattime,datediff(ss,s1.last_send_time,sysdate) ss,
'被阻塞的信息' wt,s1.sess_id wt_sess_id,s1.sql_text wt_sql_text,s1.state wt_state,
s1.trx_id wt_trx_id,s1.user_name wt_user_name,s1.clnt_ip wt_clnt_ip,
s1.appname wt_appname,s1.last_send_time wt_last_send_time,
'引起阻塞的信息' fm,s2.sess_id fm_sess_id,s2.sql_text fm_sql_text,s2.state wt_state,
s2.trx_id fm_trx_id,s2.user_name fm_user_name,s2.clnt_ip fm_clnt_ip,
s2.appname fm_appname,s2.last_send_time fm_last_send_time from v$sessions s1,v$sessions s2,v$trxwait w
where s1.trx_id=w.id and s2.trx_id=w.wait_for_id;
查询得到
这里被阻塞的sql update T_JYSB_SDYHZH_JYJG set state=?,zrqr=?,zrqrtime=?,srqr=?,srqrtime=?,dcqr=?,dcqrtime=? where id=?
引起阻塞的sql update T_JYGL_CJMX_VLD_FYDJY_XNYJJ SET SDCUSTOMID=? where pdate>=? and pdate<=?
and seqid in(select SEQID from T_JYGL_JYFB_SEQ where jycycle='M' and JYSTARTDATE>=? and JYSTARTDATE<='2025-12-01' and seqdesc in ('83','84','124','123','129','81','125','127','82','126','128','130','131','132','133','134','160','172','173','180'))
and bidsign='11' and yddyid in (select yddyid from T_BAS_YDDY_JYSJGH_MONTH where month='2025-01' and isenable='1' and customid=?);
请问这2个表都不相关,为什么会阻塞?
阻塞情况下,查询的阻塞是当前事务最后执行的SQL
例如有表A
create table a(c1 varchar2(20),c2 varchar2(20));
insert into a values('ceshi','ceshi');
insert into a values('ceshi1','ceshi1');
commit;
窗口(会话)1执行
update a set c1='test' ;
SELECT * FROM C1;
窗口(会话)2执行
DELETE from a;
此时打开窗口(会话)3查询阻塞
发现阻塞会话2显示的SQL会是SELECT * FROM C1;
相关会话连接执行的是长事务,你看到的是最后的SQL。有可能这个SQL前面执行了其他的SQL,没有提交。
如果开了dmsqllog,根据事务号去日志里找相关事务号的所有SQL进行确认。
这个引起阻塞的SQL,只是您看到的这个事务里面最后在执行的SQL,前面可能有和被阻塞SQL相关的的dml操作,必须等这个引起阻塞的这个事务里的SQL全部执行完并且递交之后才会执行被阻塞的SQL;解决办法优化引起阻塞的事务里面的慢SQL提升效率