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

本文详细分析了SQL*Netmoredatafromclient等待事件的触发原因,通过实验发现与SQL语句长度和SDU大小有关。当SQL语句过长时,即使在网络内部也会触发此事件。修改DEFAULT_SDU_SIZE参数可以解决此问题,但需同步修改客户端配置。
[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/,如需转载,请注明出处,否则将追究法律责任。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值