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


  EVENT                                    TOTAL_WAITS TIME_WAITED
  ---------------------------------------- ----------- -----------
  SQL*Net message from client                      68      477107
 
  e) client端发起的命令里不包含任何命令关键字,事件次数维持不变
    ---session 2:
        SYS@tstdb1-SQL> 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                      68      477107
 
    ---session 1:
  SYS@tstdb1-SQL> selec;
        SP2-0042: unknown command "selec" - rest of line ignored. 
       
        ---session 2:
  SYS@tstdb1-SQL> 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                      68      477107


因client在向Server端发起命令这一过程的时间非常短暂,所以我们不大容易观察到active的session等待在SQL*NET message from client事件上。我们可以用如下的过程去模拟active session的等待:
---session 2:
SYS@tstdb1-SQL> select sid,event,status from v$session where sid=862;


      SID EVENT                                    STATUS
---------- ---------------------------------------- --------
      862 SQL*Net message from client              INACTIVE
     
---session 1:
declare
v_sql varchar2(100);
begin
while ( true ) loop
v_sql:='select * from scott.t1';
execute immediate v_sql;
end loop;
end;
/


---session 2:在session 1执行期间观察SQL*Net message from client处于active,表示client端正在发送命令给server端,因为client的命令是一个无限循环,所以发送命令的这一过程始终没有结束,因此一直处于ACTIVE状态
SYS@tstdb1-SQL> select sid,event,status from v$session where sid=862;


      SID EVENT                                    STATUS
---------- ---------------------------------------- --------
      862 SQL*Net message from client              ACTIVE
     
第二种情况:
当服务器进程把PGA里的结果数据返回给客户端之后,也会触发SQL*NET message from client等待,这时等待的是客户端收到结果后给服务器进程的确认。服务器进程在返回客户端结果集的时候不是一次全量返回的,而是按照一定单位数量分多批次来返回,特别是在结果集记录数较多的时候服务器端和客户端会经历多次交互的过程,这一过程对最终用户或者接收结果的应用程序来是透明的。我们最熟悉的SQL*PLUS就是一个典型的客户端进程,我们可以通过设置set arraysize 30来限制服务器端每次最多返回30行记录给客户端,若一查询语句总共需要返回100行记录,那么以每30行为单位,服务器和客户端总共需要4个回合(30->30->30->10)才能完成100条记录的传送,当我们打开SQL*PLUS里autotrace功能执行这条查询语句就会发现SQL*Net roundtrips to/from client的统计值为4,SQL*NET message from client等待事件发生的次数近似等于SQL*Net roundtrips to/from client的统计值,对SQL*PLUS客户端程序而言,arraysize设置越大roundtrips就会较小,SQL*NET message from client等待事件次数也会越少,也即意味着服务器与客户端的通信次数减少。针对这一情况我们也来做两组简单的测试:


第(1)组:设置arraysize等于返回的行数
---session 1
SYS@tstdb1-SQL> show arraysize
arraysize 15


select count(*)from scott.t1;
  COUNT(*)
----------
        21

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

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