SQL*Net message from client 事件产生的原因分析

今天同事在做数据库巡检时,发现巡检报告中有大量的SQL*Net message from client等待事件。同事问什么情况下回产生SQL*Net message from client,为什么回产生SQL*Net message from client。
1.对于数据库的一个session来说,每时每刻都在wait 的状态。
WAIT FOR IO / WAIT FOR CPU / WAIT FOR LATCH /WAIT FOR ...
这一点你可以查询 v$session_wait,总有数据.
SQL>select sid,event,p1,p1raw from v$session_wait;

2.对于Server process来说,如果客户端发来一个请求,它处理完所有需要处理的请求之后,它就进入另一个WAIT, SQL* Net message from client ,等待着Cilent发来请求让它处理,而我们把这种wait叫做空闲事件( ildel event),并不代表真正的loading。
举一日常生活中的例子,你去银行办理业务,办理业务的窗口的业务员。如果有很多客户在等待办理业务,那么业务员会非常忙碌,但是,当他办理所有排队的业务后,没有人办理业务了,这时,业务员就处于了SQL*Net message from client状态,一直等待有人走进大厅来办理业务的客户。 就相当于业务员wait for "业务 from客户“,事实上是在休息,也就是没有loading.

4.当然也有其他情况,比如,业务员办理完业务后,一直没有按叫号器,大厅里有很多人都在等待办理业务 ,这种情况下的 (SQL*Net message from client ) 就不正常了。相 对应的Oracle里的就是网络不畅,Client想发信息给Server process,结果不成功,而Server process一直是wait for SQL*Net message from client .
5.结论, 只要网络没问题。SQL*Net message from client 这个wait不用管。

SQL*Net message to client

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'SQL*Net message to client';

    EVENT# NAME                                               PARAMETER1      PARAMETER2      PARAMETER3
---------- -------------------------------------------------- --------------- --------------- --------------------
       255 SQL*Net message to client                          driver id       #bytes
这个等待事件发生在服务器端向客户端发送消息的时候。当服务器端向客户端发送消息产生等待时,可能的原因是用户端太繁忙,无法及时接收服务器端送来的消息,也可能是网络问题导致消息无法从服务器端发送到客户端。

这个等待事件包含两个参数。

driver id:服务器端和客户端连接是用的协议信息。

#bytes:服务器端向客户端发送消息的字节数。


SQL*Net message to dblink

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'SQL*Net message to dblink';

    EVENT# NAME                                               PARAMETER1      PARAMETER2      PARAMETER3
---------- -------------------------------------------------- --------------- --------------- --------------------
       256 SQL*Net message to dblink                          driver id       #bytes
这个等待事件和SQL*Net message to client相同,不过是发生在数据库服务器端和服务器端之间的等待事件,产生这个等待的原因可能是远端服务器繁忙,而无法即时接收发送过来的消息,也可能是服务器之间网络问题导致消息无法发送过来。


这个等待事件包含两个参数。

driver id:服务器端和另一个服务器端连接是用的协议信息。

#bytes:服务器端通过dblink从另一个服务器端收到的消息的字节数。


我们可以通过下面语句查询数据库看有什么在等待,
查询v$session_wait
SELECT S.SID,
       S.SERIAL#,
       S.USERNAME,
       S.STATUS,
       S.MACHINE,
       S.PROGRAM,
       S.MODULE,
       A.SQL_TEXT
  FROM V$SESSION S,
       V$SQLAREA A
WHERE S.USERNAME IS NOT NULL
   AND S.SQL_ADDRESS = A.ADDRESS
看见 SQL* Net message from client 等待时间最长,其实这个是oracle空闲等待时间,只要网络没有问题,可以不用考略这个wait。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12798004/viewspace-1766893/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12798004/viewspace-1766893/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值