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

来源:这里教程网 时间:2026-03-03 12:01:37 作者:

[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内存的消耗.必须综合考虑,连接数量等情况,不过现在的服务器内存都很大,估计影响没我 --//  想象的这么严重.     

相关推荐