[20180926]等待事件SQLNet more data from client 7.txt

[20180926]等待事件SQLNet more data from client 7.txt

--//前几天测试分析等待事件SQLNet more data from client,今天测试改变文件大小后,查看视图V$SESSION_WAIT_HISTORY看到P2的变化.
--//链接在12c for windows测试的.
--//上班在11g for linux重复测试看看.

1.环境:
SCOTT@book> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//sqlnet.ora文件设置DEFAULT_SDU_SIZE=8192

2.测试建立脚本:
--//建立脚本大小8192,命名8192.txt(注意文件格式是linux格式),脚本很长不在贴出.

3.建立测试脚本:
--//先执行如下:
CREATE TABLE tt AS
SELECT sysdate d,0 c,P2,TIME_SINCE_LAST_WAIT_MICRO
  FROM V$SESSION_WAIT_HISTORY
 WHERE sid   = 1
   AND event = 'SQL*Net more data FROM client';

$ cat init.sql
variable i number ;
exec :i := 8192;
column sid new_value v_sid
select sid from v$mystat where rownum=1;
set verify off
set head off

$ cat loop.sql
@@8192.txt
insert into tt select sysdate,:i,P2,TIME_SINCE_LAST_WAIT_MICRO from V$SESSION_WAIT_HISTORY where sid=&v_sid and event='SQL*Net more data from client';
host sed  -i -e "3s/^.//g" 8192.txt
exec :i := :i - 1;

--//注:8192.txt 第3行最好长一些.至少包括394个字符.

$ cat loop1.sh
#! /bin/bash
sqlplus scott/book <<EOF
@ init.sql
$(seq 1 394 | xargs -i{}  echo @loop )
quit
EOF

--//测试394次,每次8192.txt文件大小减少1个字符.
--//注:我这里本地连接,没有通过网络.

4.测试结果如下:

--//执行
$ source loop1.sh
...

--//仅仅C=7844后,不再插入,也就是没有遇到这个等待事件.

5.继续分析:
SCOTT@book> select * from tt where c > 8188 order by c desc;
D                            C         P2 TIME_SINCE_LAST_WAIT_MICRO
------------------- ---------- ---------- --------------------------
2018-09-25 09:26:40       8192         10                         51
2018-09-25 09:26:40       8191         10                         83
2018-09-25 09:26:40       8190         10                         77
2018-09-25 09:26:40       8189         10                         35

--//可以发现该版本与windwos的测试不同,P2没有变化.
--//而且与前面的测试也不一样,前面测试P=30(0x1e).主要问题当是通过网络,
--//这次没有通过网络.使用本地网络.
--//sql语句长度减少,P2不变.

SELECT *
  FROM (SELECT c, p2, LEAD (p2) OVER (ORDER BY c DESC) p2x FROM tt)
 WHERE p2 <> p2x + 1 ;

         C         P2        P2X
---------- ---------- ----------
      8192         10         10
      8191         10         10
      8190         10         10
      8189         10         10
      8188         10         10
      8187         10         10
...
      7914         10         10
      7913         10         10
      7912         10         10
      7911         10         10
      7910         10         10
      7909         10         10
      7908         10         10
      7898          1          1
      7897          1         52
287 rows selected.

--//文件大小8192减少到7908,P2=10.没有变化,不理解为什么?

SCOTT@book> select * from tt where c in (select min(C) from tt);
D                            C         P2 TIME_SINCE_LAST_WAIT_MICRO
------------------- ---------- ---------- --------------------------
2018-09-25 09:26:43       7845          1                         77

--//也就是sql语句长度<=7844(如果不包括最后分号,换行,就是7842),不再出现SQL*Net more data from client等待事件.

6.继续分析:
--//通过网络测试,修改文件8192.txt大小为8191.

@ &r/spid
@ 8192.txt

--//查看P2=30.

# tcpdump -l -i eth0 -s 0 -A port 1521 and host 192.168.98.6 -nn -w 8191.raw

--//查看8192.raw
0002080: 06c0 a864 4ec7 c305 f1dc 3cd7 46b4 1803  ...dN.....<.F...
0002090: c450 1840 2979 4100 0001 7b00 0006 0000  .P.@)yA...{.....
00020a0: 0000 0035 3637 3839 3031 3233 3435 3637  ...5678901234567
00020b0: 3839 3031 3233 3435 3637 3839 3031 3233  8901234567890123
00020c0: 34ff 3536 3738 0a61 3132 3334 3536 3738  4.5678.a12345678
           ~~ --> 长度指示器
00020d0: 3930 3132 3334 3536 3738 3930 3132 3334  9012345678901234
00020e0: 3536 3738 3930 3132 3334 3536 3738 3930  5678901234567890
00020f0: 3132 3334 3536 3738 3930 3132 3334 3536  1234567890123456
0002100: 3738 3930 3132 3334 3536 3738 3930 3132  7890123456789012
0002110: 3334 3536 3738 3930 3132 3334 3536 3738  3456789012345678
0002120: 3930 3132 3334 3536 3738 0a61 3132 3334  9012345678.a1234
0002130: 3536 3738 3930 3132 3334 3536 3738 3930  5678901234567890
0002140: 3132 3334 3536 3738 3930 3132 3334 3536  1234567890123456
0002150: 3738 3930 3132 3334 3536 3738 3930 3132  7890123456789012
0002160: 3334 3536 3738 3930 3132 3334 3536 3738  3456789012345678
0002170: 3930 3132 3334 3536 3738 3930 3132 3334  9012345678901234
0002180: 3536 3738 3930 3132 3334 3536 3738 0a61  56789012345678.a
0002190: 3132 3334 3536 3738 3930 3132 3334 3536  1234567890123456
00021a0: 3738 3930 3132 3334 3536 3738 3930 3132  7890123456789012
00021b0: 3334 3536 3738 3930 3132 3334 3536 3738  3456789012345678
00021c0: 391d 3031 3233 3435 3637 0a2a 2f20 7379  9.01234567.*/ sy
           ~~ --> 长度指示器,转换10进制 29,看来前面的测试仅仅是巧合.^_^.
00021d0: 7364 6174 6520 6672 6f6d 2064 7561 6c00  sdate from dual.
00021e0: 0100 0000 0000 0000 0000 0000 0000 0000  ................
}
--//看来前面的测试只不过是一个巧合.还是无法知道P2是如何确定的.

7.总结:
--//1.SQL*Net more data from client,主要原因就是sql语句太长.与SDU设置存在密切关系.
--//2.我的测试大约78XX上下出现该等待事件,设置SDU=8192的情况下.不过还是无法分析出P2,oracle如何确定的.
--//3.如果应用很多这类sql语句,特别in的情况,可以修改为绑定变量.不行增加SDU.
--//4.看了一些链接我感觉设置大的SDU,会增加PGA内存的消耗.必须综合考虑,连接数量等情况,不过现在的服务器内存都很大,估计影响没我
--//  想象的这么严重.
    

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

转载于:http://blog.itpub.net/267265/viewspace-2214964/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值