VB から Oracle に接続して業務しているアプリでなんか遅い!との事
調べてみると DbDataReader の Read() 部分で遅くなっているようなので
Read() 処理が何をしているのかを確認してみる
業務ソースを載せるわけにはいかないのでサンプルで
テスト用テーブル&データ作成
まずは分かりやすくテスト用テーブルとデータを用意
CREATE TABLE test_table (
id INT,
birth DATE,
name VARCHAR2(50),
memo VARCHAR2(50)
);
INSERT INTO test_table (id, birth, name, memo ) VALUES (1,TO_DATE('2001/01/01','yyyy/mm/dd'),RPAD('test1', 50, '@') ,RPAD('memo1', 50, '*'));
INSERT INTO test_table (id, birth, name, memo ) VALUES (2,TO_DATE('2002/02/02','yyyy/mm/dd'),RPAD('test2', 50, '@') ,RPAD('memo2', 50, '*'));
INSERT INTO test_table (id, birth, name, memo ) VALUES (3,TO_DATE('2003/03/03','yyyy/mm/dd'),RPAD('test3', 50, '@') ,RPAD('memo3', 50, '*'));
COMMIT;
SET LINE 150
SELECT * FROM test_table;
ID BIRTH NAME MEMO
---------- -------- -------------------------------------------------- --------------------------------------------------
1 01-01-01 test1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ memo1*********************************************
2 02-02-02 test2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ memo2*********************************************
3 03-03-03 test3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ memo3*********************************************
Oracleキャッシュクリア
--共有プールを削除
ALTER SYSTEM FLUSH SHARED_POOL;
--バッファキャシュクリア
ALTER SYSTEM FLUSH BUFFER_CACHE;
SYSDBA 権限で実行のこと
一応キャッシュクリアしておく
しなくてもOK
データ取得用VB.NET
DbDataReader の Read() を利用するサンプルプログラム
Imports System.Data
Imports System.Data.Common
Module Module1
Sub Main()
'// 接続情報設定
Dim conStr As New DbConnectionStringBuilder
conStr("Data Source") = "XE"
conStr("User ID") = "test"
conStr("Password") = "test"
Dim factory As DbProviderFactory
factory = DbProviderFactories.GetFactory("System.Data.OracleClient")
'// Oralce接続
Dim con As DbConnection
con = factory.CreateConnection
con.ConnectionString = conStr.ConnectionString
con.Open()
'// SELECT してデータを取得
Using cmd As System.Data.Common.DbCommand = con.CreateCommand
cmd.CommandTimeout = 3600
cmd.CommandText = ""
'// SQL文設定
Dim sql As New System.Text.StringBuilder()
sql.Append("SELECT id ")
sql.Append(" , TO_CHAR(birth, 'yyyy/mm/dd') AS birth ")
sql.Append(" , name ")
sql.Append(" , memo ")
sql.Append(" FROM test_table ")
sql.Append(" WHERE id >= :id ")
sql.Append(" ORDER BY id ")
cmd.CommandText = sql.ToString
'// パラメータ設定
Dim param As DbParameter = factory.CreateParameter
param.DbType = DbType.Int16 '// パラメータのデータタイプ
param.ParameterName = ":id" '// パラメータ名
param.Value = 1 '// パラメータ値
param.Direction = ParameterDirection.Input '// 入力専用
'// SQL + PARAMETER
cmd.Parameters.Add(param)
Debug.Print(String.Format("SQL文:{0}", cmd.CommandText))
'// SQL 実行
Using dr As DbDataReader = cmd.ExecuteReader() '★1
Debug.Print("SQL実行終了")
' ★ Debug.Print(String.Format("レコード有無:{0}", dr.HasRows.ToString))
'// 実行結果レコード取得ループ
While dr.Read() '★2,3,4
Debug.Print(String.Format("レコード:{0}, {1}, {2}, {3}", _
dr("id").ToString, _
dr("birth").ToString, _
dr("name").ToString.Substring(0, 10), _
dr("memo").ToString.Substring(0, 10) _
))
End While
dr.Close() '★5
End Using
End Using
Debug.Print("SQL実行終了") '★6
'// Close
con.Close()
con.Dispose() '★7
con = Nothing
End Sub
' ★8
End Module
ステップ実行しながら★マークのタイミングで V$SQL と tcpdump を取得しておく
★1: SQL実行
★2: データ取得(1行目)
★3: データ取得(2行目)
★4: データ取得(3行目)
★5: DbDataReader クローズ(明示的)
★6: DbDataReader 消滅(End Using)
★7: Oracleコネクションクローズ(明示的)
★8: プログラム終了
V$SQL を確認
タイミング | OPEN_VERSIONS | USERS_OPENING | FETCHES | END_OF_FETCH_COUNT | USERS_EXECUTING | BUFFER_GETS | ROWS_PROCESSED | ELAPSED_TIME | LAST_ACTIVE_TIME |
---|---|---|---|---|---|---|---|---|---|
★1 | 1 | 1 | 0 | 0 | 1 | 37 | 0 | 2943 | 2021/6/10 15:41:29 |
★2 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★3 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★4 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★5 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★6 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★7 | 1 | 1 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★8 | 0 | 0 | 1 | 1 | 0 | 40 | 3 | 3022 | 2021/6/10 15:43:12 |
★マーク毎に前回との差分を比較するとこんな感じ
違いのあった部分だけをピックアップ
★2の DbDataReader read() 部分で実際にデータが読み込まれていることが確認できる
FETCHES や BUFFER_GETS 等々
★3~7では動きなし
以外にも★7でコネクションクローズを明示的にやってもOracle側には何も動作無し
★8のEXEが終了したタイミングでOracle側はセッションが切れたと認識している(USERS_OPENING = 0)
VB側でガベージコレクションされると切断要求が行くのかな?
ネットワークパケットキャプチャ
tcpdump で 1521 ポートの通信をキャプチャ
キャプチャしたパケットはファイルに保存
tcpdump port 1521 -s0 -w 1.dmp
1.dmp 部分は ★毎に 2.dmp 3.dmp 等に変更しながら実施していく
ネットワーク通信状況を確認
キャプチャしたパケットから★マークのタイミング毎の通信状況を確認
172.16.0.1 がVB実行機
172.16.0.3 がOracleサーバ機
見やすいように随所に◆マークでコメント追記してます。
for i in 1 2 3 4 5 6 7 8
do
echo "---------------------------------------------------------------------[[ $i ]]"
tcpdump -nn -vvv -X -r ${i}.dmp
echo
echo
done
---------------------------------------------------------------------[[ 1 ]]
reading from file 1.dmp, link-type EN10MB (Ethernet)
15:41:29.837078 IP (tos 0x0, ttl 128, id 36277, offset 0, flags [DF], proto TCP (6), length 339)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [P.], cksum 0x8e79 (correct), seq 646404084:646404383, ack 4283484160, win 1026, length 299
◆ VB -> Oracle SQL実行要求
0x0000: 4500 0153 8db5 4000 8006 13cb ac10 0001 E..S..@.........
0x0010: ac10 0003 d519 05f1 2687 57f4 ff50 c800 ........&.W..P..
0x0020: 5018 0402 8e79 0000 012b 0000 0600 0000 P....y...+......
0x0030: 0000 035e 0669 8000 0000 0000 0001 8301 ...^.i..........
0x0040: 0000 010d 0000 0001 0100 0000 0000 0000 ................
0x0050: 0000 0000 0001 0100 0000 0001 0001 0101 ................
0x0060: 0000 0000 0000 0000 0101 0000 0000 0000 ................
0x0070: 0000 0000 0000 0000 fe40 5345 4c45 4354 .........@SELECT
0x0080: 2069 6420 2020 2020 202c 2054 4f5f 4348 .id......,.TO_CH
0x0090: 4152 2862 6972 7468 2c20 2779 7979 792f AR(birth,.'yyyy/
0x00a0: 6d6d 2f64 6427 2920 2041 5320 2062 6972 mm/dd')..AS..bir
0x00b0: 7468 2020 2020 2020 2c20 406e 616d 6520 th......,.@name.
0x00c0: 2020 2020 202c 206d 656d 6f20 2020 4652 .....,.memo...FR
0x00d0: 4f4d 2074 6573 745f 7461 626c 6520 2057 OM.test_table..W
0x00e0: 4845 5245 2069 6420 3e3d 203a 6964 2020 HERE.id.>=.:id..
0x00f0: 4f52 4445 5220 4259 2069 6401 2000 0100 ORDER.BY.id.....
0x0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0110: 0000 0000 0000 0000 0000 0100 0000 0000 ................
0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0130: 0000 0203 0000 1600 0000 0000 0000 0000 ................
0x0140: 0000 0000 0000 0000 0000 0000 0000 0007 ................
0x0150: 02c1 02 ...
15:41:29.840173 IP (tos 0x0, ttl 64, id 38938, offset 0, flags [DF], proto TCP (6), length 809)
172.16.0.3.1521 > 172.16.0.1.54553: Flags [P.], cksum 0x5b40 (incorrect -> 0x2b61), seq 1:770, ack 299, win 254, length 769
◆ VB <- Oracle SQL実行結果を戻し(データは無し)
0x0000: 4500 0329 981a 4000 4006 4790 ac10 0003 E..)..@.@.G.....
0x0010: ac10 0001 05f1 d519 ff50 c800 2687 591f .........P..&.Y.
0x0020: 5018 00fe 5b40 0000 0301 0000 0600 0000 P...[@..........
0x0030: 0000 1017 0000 00e3 1ff4 3369 f01a 81dd ..........3i....
0x0040: 2e0f 9afc a6de 2e78 7906 0a10 2a1e 8400 .......xy...*...
0x0050: 0000 0400 0000 5102 0026 0016 0000 0000 ......Q..&......
0x0060: 0000 0000 0004 0000 0000 0000 0000 0000 ................
0x0070: 0000 0000 0102 0200 0000 0249 4400 0000 ...........ID...
0x0080: 0000 0000 0000 0000 0000 0001 8000 000a ................
0x0090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x00a0: 0069 0301 0a00 0000 0105 0500 0000 0542 .i.............B
0x00b0: 4952 5448 0000 0000 0000 0000 0100 0000 IRTH............
0x00c0: 0000 0180 0000 3200 0000 0000 0000 0000 ......2.........
0x00d0: 0000 0000 0000 0000 6903 0132 0000 0001 ........i..2....
0x00e0: 0404 0000 0004 4e41 4d45 0000 0000 0000 ......NAME......
0x00f0: 0000 0200 0000 0000 0180 0000 3200 0000 ............2...
0x0100: 0000 0000 0000 0000 0000 0000 0000 6903 ..............i.
0x0110: 0132 0000 0001 0404 0000 0004 4d45 4d4f .2..........MEMO
0x0120: 0000 0000 0000 0000 0300 0000 0000 0700 ................
0x0130: 0000 0778 7906 0a10 2a1e 0000 0000 e81f ...xy...*.......
0x0140: 0000 1f00 0000 1f00 0000 0000 0000 0806 ................
0x0150: 0030 1706 0000 0000 0002 0000 0000 0000 .0..............
0x0160: 0000 0000 0000 0000 0000 0013 0000 0000 ................
0x0170: 0008 0000 0008 4a41 5041 4e45 5345 1000 ......JAPANESE..
0x0180: 0000 0000 0500 0000 054a 4150 414e 0900 .........JAPAN..
0x0190: 0000 0000 0100 0000 015c 0000 0000 0000 .........\......
0x01a0: 0500 0000 054a 4150 414e 0100 0000 0000 .....JAPAN......
0x01b0: 0200 0000 022e 2c02 0000 0000 0008 0000 ......,.........
0x01c0: 0008 414c 3332 5554 4638 0a00 0000 0000 ..AL32UTF8......
0x01d0: 0900 0000 0947 5245 474f 5249 414e 0c00 .....GREGORIAN..
0x01e0: 0000 0000 0800 0000 0852 522d 4d4d 2d44 .........RR-MM-D
0x01f0: 4407 0000 0000 0008 0000 0008 4a41 5041 D...........JAPA
0x0200: 4e45 5345 0800 0000 0000 0600 0000 0642 NESE...........B
0x0210: 494e 4152 590b 0000 0000 000d 0000 000d INARY...........
0x0220: 4848 3234 3a4d 493a 5353 5846 4639 0000 HH24:MI:SSXFF9..
0x0230: 0000 0016 0000 0016 5252 2d4d 4d2d 4444 ........RR-MM-DD
0x0240: 2048 4832 343a 4d49 3a53 5358 4646 3a00 .HH24:MI:SSXFF:.
0x0250: 0000 0000 1100 0000 1148 4832 343a 4d49 .........HH24:MI
0x0260: 3a53 5358 4646 2054 5a52 3b00 0000 0000 :SSXFF.TZR;.....
0x0270: 1a00 0000 1a52 522d 4d4d 2d44 4420 4848 .....RR-MM-DD.HH
0x0280: 3234 3a4d 493a 5353 5846 4620 545a 523c 24:MI:SSXFF.TZR<
0x0290: 0000 0000 0001 0000 0001 5c34 0000 0000 ..........\4....
0x02a0: 0006 0000 0006 4249 4e41 5259 3200 0000 ......BINARY2...
0x02b0: 0000 0400 0000 0442 5954 453d 0000 0000 .......BYTE=....
0x02c0: 0005 0000 0005 4641 4c53 453e 0000 0000 ......FALSE>....
0x02d0: 000b 0000 000b 8000 0000 453c 3c80 0000 ..........E<<...
0x02e0: 00a3 0000 0000 0004 0100 0000 0400 0000 ................
0x02f0: 0000 0000 0000 0000 0200 5800 0300 0008 ..........X.....
0x0300: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0310: 0000 0000 0600 0001 0000 0000 0000 0000 ................
0x0320: 0000 0000 0000 0000 00 .........
15:41:29.889995 IP (tos 0x0, ttl 128, id 36278, offset 0, flags [DF], proto TCP (6), length 40)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [.], cksum 0x2ead (correct), seq 299, ack 770, win 1023, length 0
0x0000: 4500 0028 8db6 4000 8006 14f5 ac10 0001 E..(..@.........
0x0010: ac10 0003 d519 05f1 2687 591f ff50 cb01 ........&.Y..P..
0x0020: 5010 03ff 2ead 0000 P.......
---------------------------------------------------------------------[[ 2 ]]
reading from file 2.dmp, link-type EN10MB (Ethernet)
15:43:13.366287 IP (tos 0x0, ttl 128, id 36436, offset 0, flags [DF], proto TCP (6), length 61)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [P.], cksum 0x1d83 (correct), seq 646404383:646404404, ack 4283484929, win 1023, length 21
◆ VB -> Oracle SQL実行結果のデータちょうだい要求( DbDataReader の read() )
0x0000: 4500 003d 8e54 4000 8006 1442 ac10 0001 E..=.T@....B....
0x0010: ac10 0003 d519 05f1 2687 591f ff50 cb01 ........&.Y..P..
0x0020: 5018 03ff 1d83 0000 0015 0000 0600 0000 P...............
0x0030: 0000 0305 0702 0000 00f1 0000 00 .............
15:43:13.366486 IP (tos 0x0, ttl 64, id 38939, offset 0, flags [DF], proto TCP (6), length 542)
172.16.0.3.1521 > 172.16.0.1.54553: Flags [P.], cksum 0x5a35 (incorrect -> 0x19c8), seq 1:503, ack 21, win 254, length 502
◆ VB <- Oracle データ渡し(3レコード分)
0x0000: 4500 021e 981b 4000 4006 489a ac10 0003 E.....@.@.H.....
0x0010: ac10 0001 05f1 d519 ff50 cb01 2687 5934 .........P..&.Y4
0x0020: 5018 00fe 5a35 0000 01f6 0000 0600 0000 P...Z5..........
0x0030: 0000 0622 0400 0000 0000 f100 0000 0000 ..."............
0x0040: 0000 0000 0000 0000 0702 c102 0a32 3030 .............200
0x0050: 312f 3031 2f30 3132 7465 7374 3140 4040 1/01/012test1@@@
0x0060: 4040 4040 4040 4040 4040 4040 4040 4040 @@@@@@@@@@@@@@@@
0x0070: 4040 4040 4040 4040 4040 4040 4040 4040 @@@@@@@@@@@@@@@@
0x0080: 4040 4040 4040 4040 4040 326d 656d 6f31 @@@@@@@@@@2memo1
0x0090: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x00a0: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x00b0: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a07 02c1 *************...
0x00c0: 030a 3230 3032 2f30 322f 3032 3274 6573 ..2002/02/022tes
0x00d0: 7432 4040 4040 4040 4040 4040 4040 4040 t2@@@@@@@@@@@@@@
0x00e0: 4040 4040 4040 4040 4040 4040 4040 4040 @@@@@@@@@@@@@@@@
0x00f0: 4040 4040 4040 4040 4040 4040 4040 4032 @@@@@@@@@@@@@@@2
0x0100: 6d65 6d6f 322a 2a2a 2a2a 2a2a 2a2a 2a2a memo2***********
0x0110: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x0120: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x0130: 2a2a 1504 000f 0702 c104 0a32 3030 332f **.........2003/
0x0140: 3033 2f30 3332 7465 7374 3340 4040 4040 03/032test3@@@@@
0x0150: 4040 4040 4040 4040 4040 4040 4040 4040 @@@@@@@@@@@@@@@@
0x0160: 4040 4040 4040 4040 4040 4040 4040 4040 @@@@@@@@@@@@@@@@
0x0170: 4040 4040 4040 4040 326d 656d 6f33 2a2a @@@@@@@@2memo3**
0x0180: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x0190: 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a 2a2a ****************
0x01a0: 2a2a 2a2a 2a2a 2a2a 2a2a 2a04 0100 0000 ***********.....
0x01b0: 0500 0300 0000 7b05 0000 0000 0200 0000 ......{.........
0x01c0: 0300 2008 0000 0000 0000 0000 0000 0000 ................
0x01d0: 0000 0000 0000 0000 0700 0001 0000 0000 ................
0x01e0: 0000 0000 0000 0000 0000 0000 0030 4f52 .............0OR
0x01f0: 412d 3031 3430 333a 20e3 8387 e383 bce3 A-01403:........
0x0200: 82bf e381 8ce8 a68b e381 a4e3 818b e382 ................
0x0210: 8ae3 81be e381 9be3 8293 e380 820a ..............
15:43:13.421212 IP (tos 0x0, ttl 128, id 36437, offset 0, flags [DF], proto TCP (6), length 40)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [.], cksum 0x2ca4 (correct), seq 21, ack 503, win 1021, length 0
0x0000: 4500 0028 8e55 4000 8006 1456 ac10 0001 E..(.U@....V....
0x0010: ac10 0003 d519 05f1 2687 5934 ff50 ccf7 ........&.Y4.P..
0x0020: 5010 03fd 2ca4 0000 P...,...
---------------------------------------------------------------------[[ 3 ]]
reading from file 3.dmp, link-type EN10MB (Ethernet)
◆ 2行目の要求時点では通信無し
---------------------------------------------------------------------[[ 4 ]]
reading from file 4.dmp, link-type EN10MB (Ethernet)
◆ 3行目の要求時点では通信無し
---------------------------------------------------------------------[[ 5 ]]
reading from file 5.dmp, link-type EN10MB (Ethernet)
◆ DbDataReader クローズ(明示的)時点では通信無し
---------------------------------------------------------------------[[ 6 ]]
reading from file 6.dmp, link-type EN10MB (Ethernet)
◆ DbDataReader 消滅(End Using)時点では通信無し
---------------------------------------------------------------------[[ 7 ]]
reading from file 7.dmp, link-type EN10MB (Ethernet)
◆ Oracleコネクションクローズ(明示的)時点では通信無し
---------------------------------------------------------------------[[ 8 ]]
reading from file 8.dmp, link-type EN10MB (Ethernet)
15:45:54.050998 IP (tos 0x0, ttl 128, id 36972, offset 0, flags [DF], proto TCP (6), length 53)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [P.], cksum 0x1b79 (correct), seq 646404404:646404417, ack 4283485431, win 1021, length 13
◆ プログラム終了でメモリ開放? VB -> Oracle ログオフ要求か?
0x0000: 4500 0035 906c 4000 8006 1232 ac10 0001 E..5.l@....2....
0x0010: ac10 0003 d519 05f1 2687 5934 ff50 ccf7 ........&.Y4.P..
0x0020: 5018 03fd 1b79 0000 000d 0000 0600 0000 P....y..........
0x0030: 0000 0309 08 .....
15:45:54.051410 IP (tos 0x0, ttl 64, id 38940, offset 0, flags [DF], proto TCP (6), length 57)
172.16.0.3.1521 > 172.16.0.1.54553: Flags [P.], cksum 0x5850 (incorrect -> 0x206b), seq 1:18, ack 13, win 254, length 17
0x0000: 4500 0039 981c 4000 4006 4a7e ac10 0003 E..9..@.@.J~....
0x0010: ac10 0001 05f1 d519 ff50 ccf7 2687 5941 .........P..&.YA
0x0020: 5018 00fe 5850 0000 0011 0000 0600 0000 P...XP..........
0x0030: 0000 0901 0000 0000 00 .........
15:45:54.051752 IP (tos 0x0, ttl 128, id 36973, offset 0, flags [DF], proto TCP (6), length 50)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [P.], cksum 0x262a (correct), seq 13:23, ack 18, win 1021, length 10
0x0000: 4500 0032 906d 4000 8006 1234 ac10 0001 E..2.m@....4....
0x0010: ac10 0003 d519 05f1 2687 5941 ff50 cd08 ........&.YA.P..
0x0020: 5018 03fd 262a 0000 000a 0000 0600 0000 P...&*..........
0x0030: 0040 .@
15:45:54.051755 IP (tos 0x0, ttl 128, id 36974, offset 0, flags [DF], proto TCP (6), length 40)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [F.], cksum 0x2c7b (correct), seq 23, ack 18, win 1021, length 0
0x0000: 4500 0028 906e 4000 8006 123d ac10 0001 E..(.n@....=....
0x0010: ac10 0003 d519 05f1 2687 594b ff50 cd08 ........&.YK.P..
0x0020: 5011 03fd 2c7b 0000 P...,{..
15:45:54.051801 IP (tos 0x0, ttl 64, id 38941, offset 0, flags [DF], proto TCP (6), length 40)
172.16.0.3.1521 > 172.16.0.1.54553: Flags [F.], cksum 0x2f79 (correct), seq 18, ack 24, win 254, length 0
0x0000: 4500 0028 981d 4000 4006 4a8e ac10 0003 E..(..@.@.J.....
0x0010: ac10 0001 05f1 d519 ff50 cd08 2687 594c .........P..&.YL
0x0020: 5011 00fe 2f79 0000 P.../y..
15:45:54.052028 IP (tos 0x0, ttl 128, id 36975, offset 0, flags [DF], proto TCP (6), length 40)
172.16.0.1.54553 > 172.16.0.3.1521: Flags [.], cksum 0x2c7a (correct), seq 24, ack 19, win 1021, length 0
0x0000: 4500 0028 906f 4000 8006 123c ac10 0001 E..(.o@....<....
0x0010: ac10 0003 d519 05f1 2687 594c ff50 cd09 ........&.YL.P..
0x0020: 5010 03fd 2c7a 0000 P...,z..
まとめ
DbDataReader の Read() のタイミングでデータを取りに行っている。
cmd.ExecuteReader() のタイミングではデータは取得していない。
単純にSQL文が正常かどうかを見ているだけか?
HasRow() を実施した際は、HasRow() のタイミングでデータを取得している。
※ 記事には記載していないけど、サンプルソースのコメントアウトを外すと HasRow でデータ取得しちゃってる。
Read() のタイミングで Oracle は Buffer または Disk からのデータ読み取りをして、読み取ったデータを転送している。
という事で Read() のタイミングで遅いというのは・・
単純にSQLの実行に時間がかかっている時には遅い
sqlplus でSQLを実行した際に時間のかかるSQLの場合は Read() も遅い。
同じSQLをsqlplus で実行しても早いのに VB の Read() が遅いことが場合は・・
ディスクの負荷が高くなっていて単純に読み込みに時間がかかってるとか?
データ読み取りのディスクブロックがちょうど別処理の書き込み中でロックされてるとか?
ネットワークのパケ詰まりとか?
可能性としてはブロックのロックとかかなぁ
次は Trace かけてもっと詳細に調べたいけど・・
SYSDBA権限もらえないと厳しいなぁ