[20180920]等待事件SQLNet more data from client 3.txt

lfree發表於2018-09-21
[20180920]等待事件SQLNet more data from client 3.txt

--//很少關注SQL*Net more data from client,最近正好看一份awr報表比較靠前.
--//前幾天測試一種情況,就是sql語句太長,導致出現SQL*Net more data from client事件.
--//今天測試看看到底多長的sql語句會出現這個等待事件.

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

SCOTT@book> @ &r/ev_name "SQL*Net more data from client"
    EVENT#   EVENT_ID NAME                                     PARAMETER1           PARAMETER2           PARAMETER3           WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
---------- ---------- ---------------------------------------- -------------------- -------------------- -------------------- ------------- ----------- --------------------
       355 3530226808 SQL*Net more data from client            driver id            #bytes                                       2000153315           7 Network
--//P2引數時傳輸的位元組數.

--//首先先澄清一點,oracle執行指令碼時會把dos文字轉化為linux文字格式(實際上這個行為發生在客戶端,至少sqlplus是這樣做的),
--//這樣如果你在windows下建立的指令碼實際上多數情況下時dos格式的.實際上就是行尾為0x0d ox0a (回車換行).執行時傳輸到伺服器腳
--//本linux格式,這樣大小判斷很容易誤判,建議建立的指令碼檔案linux格式,這樣比較看指令碼檔案大小好判斷問題.

--//在windows下建立linux格式文字方法很多,不行可以在linux下建立然後複製到windows機器.不行直接在linux機器測試應該也可以.
--//我的測試即使不透過網路,只要sql語句足夠長,也會出現SQL*Net more data from client等待事件.

--//另外說明一下,我開始使用10046時間跟蹤分析,感覺不是很方面,我發現V$SESSION_WAIT_HISTORY記錄各個回話最後10個等待事件,
--//使用該檢視可以更快的分析該問題,而不必檢視跟蹤檔案.

2.測試建立指令碼:
--//建立sql語句指令碼.大小我開始選擇2K(我開始認為與MTU相關).測試發現沒有出現SQL*Net more data from client.
--//建立指令碼大小8192,命名8192.txt(注意檔案格式是linux格式),估計與sdu有關.指令碼很長不在貼出.

$ ls -l 8192.txt
-rw-r--r-- 1 oracle oinstall 8192 2018-09-21 09:02:58 8192.txt

--//在client端192.168.98.6登陸資料庫,執行以上指令碼:
--//session 1:
SCOTT@78> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- ------------------------------------------------
        54          7 2924:6532                DEDICATED 10147       28          3 alter system kill session '54,7' immediate;

--//session 2:
SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=54 and event='SQL*Net more data from client';
no rows selected

--//當前沒出現SQL*Net more data from client等待事件.

--//session 1:
@ 8192.txt
@ 8192.txt

--//同時在服務端使用tcpdump抓包工具:
#  tcpdump -l -i eth0 -s 0 port 1521 and host 192.168.98.6 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:09:34.655552 IP 192.168.98.6.50660 > 192.168.100.78.1521: P 1955725933:1955734044(8111) ack 1287055697 win 16399
09:09:34.655697 IP 192.168.98.6.50660 > 192.168.100.78.1521: P 8111:8491(380) ack 1 win 16399
09:09:34.655734 IP 192.168.100.78.1521 > 192.168.98.6.50660: . ack 8111 win 330
09:09:34.655770 IP 192.168.100.78.1521 > 192.168.98.6.50660: P 1:269(268) ack 8491 win 330
09:09:34.655929 IP 192.168.98.6.50660 > 192.168.100.78.1521: P 8491:8512(21) ack 269 win 16332
09:09:34.656014 IP 192.168.100.78.1521 > 192.168.98.6.50660: P 269:371(102) ack 8512 win 330
09:09:34.854597 IP 192.168.98.6.50660 > 192.168.100.78.1521: . ack 371 win 16307
--//再次執行:
# tcpdump -l -i eth0 -s 0 -A port 1521 and host 192.168.98.6 -nn -w 8192.raw
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C7 packets captured
7 packets received by filter
0 packets dropped by kernel

--//注:192.168.98.6是client端 IP地址.
--//-s 0 可以capture size 65535 bytes -nn 避免IP,服務名發生轉換.

--//session 2:
SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=54 and event='SQL*Net more data from client';
       SID       SEQ#     EVENT# EVENT                          P1TEXT             P1 P2TEXT             P2 P3TEXT             P3  WAIT_TIME WAIT_TIME_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- --------------------------
        54          4        355 SQL*Net more data from client  driver id  1413697536 #bytes             30                     0          0               9                         83
        54          9        355 SQL*Net more data from client  driver id  1413697536 #bytes             30                     0          0              17                        110
--//P2=30.

3.首先檢視8192.raw檔案:

# xxd -c 32 8192.raw | head -20
0000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000 ffff 0000 0100 0000 f044 a45b 1bf4 0600  悅....................餌.[.?.
0000020: e51f 0000 e51f 0000 a0d3 c1f4 713c 0cda 41b6 4e07 0800 4500 1fd7 5141 4000 7f06  ?..?...恿魆<.贏.N...E...QA@...
0000040: 433a c0a8 6206 c0a8 644e c5e4 05f1 7492 23ad 4cb6 eac3 5018 3fb3 676f 0000 1faf  C:?b.?dN配.駎.#.L.昝P.?.go....
0000060: 0000 0600 0000 0000 1169 26fe ffff ffff ffff ff01 0000 0004 0000 0003 5e27 6180  .........i&?.........^'a.
0000080: 0000 0000 0000 feff ffff ffff ffff fe1f 0000 feff ffff ffff ffff 0d00 0000 feff  ......??..?....?
00000a0: ffff ffff ffff feff ffff ffff ffff 0000 0000 0100 0000 0000 0000 0000 0000 0000  ?..................
00000c0: 0000 0000 0000 0000 0000 0000 0000 feff ffff ffff ffff 0000 0000 0000 0000 feff  ..............?........?
00000e0: ffff ffff ffff feff ffff ffff ffff feff ffff ffff ffff 0000 0000 0000 0000 feff  ??........?
0000100: ffff ffff ffff feff ffff ffff ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000  ?..................
0000120: 0000 0000 0000 0000 0000 feff 7365 6c65 6374 0a2f 2a2b 0a61 3132 3334 3536 3738  ..........?select./*+.a12345678
                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--// 0xff表示sql語句長度255.後面會反覆出現.語句出現在偏於0x12c. 12c=300 ,300處. */

0000140: 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930  90123456789012345678901234567890
0000160: 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132  12345678901234567890123456789012
0000180: 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 0a61 3132 3334  34567890123456789012345678.a1234
00001a0: 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536  56789012345678901234567890123456
00001c0: 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738  78901234567890123456789012345678
00001e0: 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 0a61  901234567890123456789012345678.a
0000200: 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132  12345678901234567890123456789012
0000220: 3334 3536 3738 3930 3132 33ff 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233  3456789012345678901234567890123
                                    ~~ => 再次出現
0000240: 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233 3435  45678901234567890123456789012345
0000260: 3637 380a 6131 3233 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233 3435 3637  678.a123456789012345678901234567

# cp 8192.raw 8192.r1

--//編輯8192.r1檔案取出第一個包的sql語句部分.
# ls -l 8192.r1
-rw-r--r-- 1 root root 7906 2018-09-21 09:17:22 8192.r1

# od -A x -t x1 8192.r1 | grep ff | head
0000f0 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 ff
0001f0 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 ff
0002f0 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 ff
0003f0 34 35 36 37 38 0a 61 31 32 33 34 35 36 37 38 ff
0004f0 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 ff
0005f0 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 ff
0006f0 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 ff
0007f0 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 ff
0008f0 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 ff
0009f0 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 ff

--//出現0xff,不是文字輸入的,實際上表示sql長度.偏移相減正好256. 0x1ff - 0xff = 0x100= 256(十進位制),也驗證了0xff是sql語句的長度指示器.

# od -A x -t x1 8192.r1 | grep ff | wc
     30     510    1650
--//一共30處ff.
--//8192.r1檔案大小7906.
--//7906-30-1 = 7875 (說明-1要去掉最後一行0xa字元). 按照這個推理sql長度在7875(不包括後面的分號以及換行符).包括就是7877
--//(實際上依舊出現SQL*Net more data from client).
--//但是疑問來了檢視等待事件顯示的P2=30.明顯與8192差一大截呢?

# cp 8192.raw 8192.r2
--//編輯8192.r2檔案取出第二個包的sql語句部分.
# ls -l 8192.*
-rw-r--r-- 1 root root 7906 2018-09-21 09:17:22 8192.r1
-rw-r--r-- 1 root root  318 2018-09-21 09:25:59 8192.r2
-rw-r--r-- 1 root root 9402 2018-09-21 09:10:11 8192.raw

# od -A x -t x1 8192.r2 | grep ff | wc
      1      17      55

--//7905(扣除最後1個0x0a)+318-31 = 8192 ,不對啊?應該是8191才對.還差最後一個;(分號)沒算呢?

# xxd -c 32 8192.r2
0000000: 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233 3435 3637 3839 3031 3233 ff34  4567890123456789012345678901234
                                                                                    ~~
0000020: 3536 3738 0a61 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536  5678.a12345678901234567890123456
0000040: 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738  78901234567890123456789012345678
0000060: 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930  90123456789012345678901234567890
0000080: 3132 3334 3536 3738 0a61 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132  12345678.a1234567890123456789012
00000a0: 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334  34567890123456789012345678901234
00000c0: 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536  56789012345678901234567890123456
00000e0: 3738 3930 3132 3334 3536 3738 0a61 3132 3334 3536 3738 3930 3132 3334 3536 3738  789012345678.a123456789012345678
0000100: 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 3930 3132 3334 3536 3738 1e39  901234567890123456789012345678.9
                                                                                    ~~
0000120: 3031 3233 3435 3637 0a2a 2f20 7379 7364 6174 6520 6672 6f6d 2064 7561 6c0a       01234567.*/ sysdate from dual.

--// 0xff , 0x1e 應該表示sql語句長度,不是我輸入的,少算這個0x1e.這樣前面少減1.正好能對上.
--// 取出0x1e後面ascii碼,連線如下:
3930313233343536370a2a2f20737973646174652066726f6d206475616c
--//正好60,對應30個字元.
--//0x1e=30 ,oracle這個等待事件僅僅記錄最後剩下語句部分的長度.具有一定欺騙性.實際上還有255個位元組.
--//我再次看我前面的測試:
--//連結:http://blog.itpub.net/267265/viewspace-2214441/=>[20180918]等待事件SQL/Net more data from client.txt
*** 2018-09-18 21:36:57.617
WAIT #357727064: nam='SQL*Net message from client' ela= 4828299 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=6462066625
CLOSE #357727064:c=0,e=9,dep=0,type=1,tim=6462066791
WAIT #0: nam='SQL*Net more data from client' ela= 11473 driver id=1413697536 #bytes=3223974 p3=0 obj#=-1 tim=6462079887
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--//當時檔案3M,這裡記錄又很大,真搞不懂....
D:\tmp>ls -l test.txt
ls -l test.txt
-rw-rw-rw-   1 user     group     3233179 Sep 18 21:34 test.txt
--//大小3M.估計當時檔案是dos格式的.繼續分析...

# env COLUMNS=148 /usr/bin/bvi 8192.raw
--//說明設定COLUMNS=148,這樣一行32個字元.
....
00001F20  38 39 30 31 32 33 34 35 36 37 38 FF 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 89012345678.90123456789012345678
                                           ~~=>長度指示器
00001F40  39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 90123456789012345678901234567890
00001F60  31 32 33 34 35 36 37 38 0A 61 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 12345678.a1234567890123456789012   
00001F80  33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 34567890123456789012345678901234
00001FA0  35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 56789012345678901234567890123456
00001FC0  37 38 39 30 31 32 33 34 35 36 37 38 0A 61 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 789012345678.a123456789012345678
00001FE0  39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 90123456789012345678901234567890
00002000  31 32 33 34 35 36 37 38 39 30 31 32 33 F0 44 A4 5B 7E F4 06 00 B2 01 00 00 B2 01 00 00 A0 D3 C1 1234567890123.D.[~..............
00002020  F4 71 3C 0C DA 41 B6 4E 07 08 00 45 00 01 A4 51 47 40 00 7F 06 61 67 C0 A8 62 06 C0 A8 64 4E C5 .q<..A.N...E...QG@...ag..b...dN.
                                                                               ~~~~~~~~~~~ ~~~~~~~~~~~ => 對應IP地址.
00002040  E4 05 F1 74 92 43 5C 4C B6 EA C3 50 18 3F B3 CF 7E 00 00 01 7C 00 00 06 00 00 00 00 00 34 35 36 ...t.C\L...P.?..~...|........456
00002060  37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 FF 34 35 36 37 789012345678901234567890123.4567
                                                                                           ~~=>長度指示器.
00002080  38 0A 61 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 8.a12345678901234567890123456789
000020A0  30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 01234567890123456789012345678901
000020C0  32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 23456789012345678901234567890123
000020E0  34 35 36 37 38 0A 61 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 45678.a1234567890123456789012345
00002100  36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 67890123456789012345678901234567
00002120  38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 89012345678901234567890123456789
00002140  30 31 32 33 34 35 36 37 38 0A 61 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 012345678.a123456789012345678901
00002160  32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 1E 39 30 31 32 234567890123456789012345678.9012
                                                                                           ~~=>長度指示器.
00002180  33 34 35 36 37 0A 2A 2F 20 73 79 73 64 61 74 65 20 66 72 6F 6D 20 64 75 61 6C 00 01 00 00 00 00 34567.*/ sysdate from dual......
000021A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................................

--//你可以發現中間是亂碼,就是這個255字元被分成2部分.把中間亂碼部分不算看看有多少字元.
--//20+6*32+13+3+27  = 255
--//可以驗證我的判斷是對的.
--//0xc0=192 0xA8=168 0x62=98 0x06=6    192.168.98.6
--//0xc0=192 0xA8=168 0x64=100 0x4e=78  192.168.100.78              

--//有點奇怪的是如果我減少1個字元.

R:\>ls -l 8192.txt
-rw-rw-rw-   1 user     group        8191 Sep 21 10:04 8192.txt

--//session 1:
@ 8192.txt
@ 8192.txt

--//session 2:
SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
       SID       SEQ#     EVENT# EVENT                          P1TEXT             P1 P2TEXT             P2 P3TEXT             P3  WAIT_TIME WAIT_TIME_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- --------------------------
        80          4        355 SQL*Net more data from client  driver id  1413697536 #bytes             30                     0          0              10                         74
        80          9        355 SQL*Net more data from client  driver id  1413697536 #bytes             30                     0          0              16                        133

--//依舊是30??,減少許多字元,這個P2一直是30.是否巧合呢?明天測試大小8191的指令碼看看.
--//8192.txt檔案大小到7833時,依舊出現這個等待事件.

SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
       SID       SEQ#     EVENT# EVENT                          P1TEXT             P1 P2TEXT             P2 P3TEXT             P3  WAIT_TIME WAIT_TIME_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- --------------------------
        80          4        355 SQL*Net more data from client  driver id  1413697536 #bytes              9                     0          0               3                         71
        80          9        355 SQL*Net more data from client  driver id  1413697536 #bytes              9                     0          0               4                         78

--//減少到7832.

SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
       SID       SEQ#     EVENT# EVENT                          P1TEXT             P1 P2TEXT             P2 P3TEXT             P3  WAIT_TIME WAIT_TIME_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- --------------------------
        80          4        355 SQL*Net more data from client  driver id  1413697536 #bytes              8                     0          0               3                         84
        80          9        355 SQL*Net more data from client  driver id  1413697536 #bytes              8                     0          0               4                         76

--//減少到7825.
SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
       SID       SEQ#     EVENT# EVENT                          P1TEXT             P1 P2TEXT             P2 P3TEXT             P3  WAIT_TIME WAIT_TIME_MICRO TIME_SINCE_LAST_WAIT_MICRO
---------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------- --------------------------
        80          4        355 SQL*Net more data from client  driver id  1413697536 #bytes              1                     0          0               3                         83
        80          9        355 SQL*Net more data from client  driver id  1413697536 #bytes              1                     0          0               3                        115

--//減少到7824.
SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
no rows selected

--//總之減少到7824不再出現該等待事件(不算最後的分號 0xa,sql語句長度7822).至於前面減少字元後P2引數=30,超出本人能力,分析網
--//路資料包需要另外的軟體,本人實在不擅長^_^

4.修改sqlnet.ora後:
--//修改服務端的sqlnet.ora加入:
DEFAULT_SDU_SIZE=32768

--//注意client與服務端都要修改,我client修改tnsnames.ora:
78=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.78)(PORT = 1521))
    )
    (SDU = 32768)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = book)
    )
  )

--//恢復檔案大小8192後,執行:
@ 8192.txt
@ 8192.txt

SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
no rows selected

--//增加到32192後.

R:\>ls -l 8192.txt
-rw-rw-rw-   1 user     group       32192 Sep 21 10:19 8192.txt

SCOTT@78> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------ ------- ---------- -----------------------------------------------
        80         39 3592:5952                DEDICATED 10909       30         16 alter system kill session '80,39' immediate;

@ 8192.txt
@ 8192.txt

SCOTT@book> select * from V$SESSION_WAIT_HISTORY where sid=80 and event='SQL*Net more data from client';
no rows selected

--//可以發現增加DEFAULT_SDU_SIZE=32768,不在出現SQL*Net more data from client等待事件.

5.總結:
--//1.分析亂,主要我一邊測試一邊找規律,有一些純粹是猜測.毫無目的,不知道什麼時候能改掉這個毛病...
--//2.網路部分自己要好好補習,相關知識太欠缺了.也許太久不接觸了,有點退步了.
--//3.沒有注意到oracle執行指令碼時傳輸到服務端.去掉了0x0d,這裡浪費的時間太多.知道使用tcpdump才恍然大悟.
--//4.快放假,有點心不在焉...
--//5.至於sql語句超長,主要是一些開發使用in 裡面的值很多,因為有1000個數值的限制,有一些還加入or.
--//如果每個值8個字元,加上逗號.1000個過了9000,這樣超出限制.
--//6.最佳化它僅僅修改引數DEFAULT_SDU_SIZE=32767,缺點是客戶端也要修改.如果3層應用問題不是太大.
--//6.最佳化這個等待事件除了讓開發減少這類語句,或者IN改成使用繫結變數,我記憶裡定義函式
--//  str2numlist,str2varlist(網上應該可以找到),或者其他方法.例子:

SCOTT@test01p> select * from dept where deptno in ( select  * from  table (cast(STR2numLIST('10,20') as numtabletype)) a );
    DEPTNO DNAME                LOC
---------- -------------------- -------------
        10 ACCOUNTING           NEW YORK
        20 RESEARCH             DALLAS
        
--//把'10,20'換成繫結變數就ok了,當然缺點就是字串有4000個字元的限制.
--//11g還可以這樣:
SQL> var a varchar2(60);
SQL> exec :a := '10,20';

PL/SQL procedure successfully completed.

SQL> select * from dept where deptno in  (select (column_value).getnumberval() from xmltable(:a));
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
--//缺點依舊是字串有4000個字元的限制.如果in變數裡面是字串有點麻煩.
--//我google看一下,還可以使用正規表示式,例子:
SELECT *
  FROM dept
 WHERE deptno IN
 ( SELECT TO_NUMBER (REGEXP_SUBSTR ( '10,20' ,'[^,]+' ,1 ,LEVEL)) FROM DUAL CONNECT BY REGEXP_SUBSTR ( '10,20' ,'[^,]+' ,1 ,LEVEL) IS NOT NULL);

select regexp_substr('A1,A2,A4','[^,]+', 1, level)
from dual
connect BY regexp_substr('A1,A2,A4', '[^,]+', 1, level)  is not null;

--//也許in值很多的情況,插入臨時表也許是一個選擇,特別12c 支援臨時undo,這樣產生的日誌也很小,當然這個需要測試.

--//7.有時間給測試為什麼減少檔案時P2=30不變.看來給認真規劃這個測試....
--//8.團隊沒人交流,太鬱悶了.....自己也在思考是否有點鑽牛角尖了....

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2214727/,如需轉載,請註明出處,否則將追究法律責任。

相關文章