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

lfree發表於2018-09-26

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章