Oracle SQL*Net相关的空闲等待事件

空闲等待事件,从字面上理解似乎并不需要我们花多大心思去关心,就让它等在那里呗,万事总有它存在的道理,特别对于SQL*Net系列等待事件而言,细细琢磨还是有不少文章可做的。

---------<    Part 1. 那些我们经常见到的SQL*Net等待  >---------
SQL*NET message to client等待事件
Server process通知client准备接收服务器端返回的数据,通知完成后SQL*NET message to client等待事件立即结束,然后server process开始将要返回的数据从Buffer cache复制到PGA,再从PGA传送给client。SQL*NET message to client等待事件发生的次数与SQL*NET message from client发生次数相当。在10046 Trace文件里我们一般可以观察到"SQL*NET message to client"总是先于"SQL*NET message from client"出现

SQL*NET message from client等待事件
笼统的说就是服务器进程空闲等待来自客户端进程的消息响应。
最常见的情况是session连接到数据库上之后什么事情都不干,这时我们到v$session里可以查询到该session的status='ACTIVE', event='SQL*NET message from client',表示server process正在等待client process发指令,例如:
(如无特殊说明,本文中session 1用来执行测试用的SQL,session 2用来监测session 1执行时产生的统计信息)
---session 1:
select * from v$mystat where rownum=1;
      SID STATISTIC#      VALUE
---------- ---------- ----------
      862          0          0

---session 2: 查询session 1的状态
col event format a40
set linesize 120
select sid,event,status from v$session where sid=862 and event in ('SQL*Net message to client','SQL*Net message from client');
      SID EVENT                                    STATUS
---------- ---------------------------------------- --------
      862 SQL*Net message from client              INACTIVE

---session 2: 如果session 1一直无所事事,那么SQL*Net message from client事件的等待次数一直不会增加,直到下一次该事件被触发total_waits、time_waited才会累计上升
select event,total_waits,time_waited from v$session_event where sid=862 and event in ('SQL*Net message from client');


EVENT                                    TOTAL_WAITS TIME_WAITED
---------------------------------------- ----------- -----------
SQL*Net message from client                      30      45497


select event,total_waits,time_waited from v$session_event where sid=862 and event in ('SQL*Net message from client');


EVENT                                    TOTAL_WAITS TIME_WAITED
---------------------------------------- ----------- -----------
SQL*Net message from client                      30      45497


total_waits比较好理解,等一次往上加1;TIME_WAITED(单位是百分之一秒)会把之前等待的事件累计上去,例如Session 1等待了30秒后再次发起了一条select * from dual,那么在session 2里再次运行select event,total_waits,time_waited from v$session_event where sid=862 and event in ('SQL*Net message from client')后的结果基本就是:


EVENT                                    TOTAL_WAITS TIME_WAITED
---------------------------------------- ----------- -----------
SQL*Net message from client                      33      48497    <---45497+空闲等待的30秒时间


所谓空闲等待事件的头衔应该就是这样来的吧,纯粹的空闲等待事件并无任何研究价值,我们只关心"SQL*Net message from client"等待事件的次数何时会上升,根据实验结果我们发现有以下两种情况:
第一种情况:
client端向Server端发起一条SQL命令,只要该命令包含了命令关键字,"SQL*Net message from client"事件就会增长。
验证过程如下:
  a) client端发起一条命令后有结果行返回,事件次数从30->36
      ---session 2:
        select event,total_waits,time_waited from v$session_event where sid=862 and event in ('SQL*Net message from client');
 EVENT                                    TOTAL_WAITS TIME_WAITED
 ---------------------------------------- ----------- -----------
 SQL*Net message from client                      30      45497


  ---session 1:
  SQL> select * from dual;
 
 DUMMY
 -----
 X

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/78d0dc091b09ee4d1a08af87d100fc3c.html