- PR -

DataAdapterのレスポンスについて

1
投稿者投稿内容
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2006-09-25 16:29
いつも参考にさせていてだいております。

以前にも話題になっているようですが、
Oracleを使用する際のデータプロバイダを検討しているところです。

「DB接続ドライバは、DBメーカーに合わせたほうが良い」的な考えにより、
ODPを使用して開発を進めておりましたが、
DataAdapterの使用時に問題が発生しました。

DataAdapterにて2000件弱のレコードを取得しようとした場合、
DataAdapterのFillが返ってくるまでに

 ODPでは      1分10秒
 OracleClientでは  1秒

と、レスポンスに大きな違いが出てしまいました。

なお、同じSELECT文をDataReaderで取得し、データテーブルに設定した場合には
ODPでも1秒かからずに処理が終了します。

ODPでDataAdapterを使用する場合にのみ、
異常に処理時間がかかるように思われます。

これを使用しないで開発を進めることは可能ですが、
なぜこのような現象になるのか、根拠がわからず、
コーディングも短いため、コーディングに問題があるとも考えられず、
なんだかすっきりしない状態でおります。

どなたか、同様の現象を確認したことがある方、あるいは
この現象の根拠が推測できる方がおられましたら、
書込みをお願いいたします。

なお、実際のコーディングは以下の通りです。

Imports Oracle.DataAccess.Client
Imports System.Data.OracleClient
※Imports宣言を切り替えて動作を確認しています。

Dim SQL As New System.Text.StringBuilder

SQL.Append("SELECT * FROM MSHOHIN ")
SQL.Append(" WHERE ")
SQL.Append(" TENPOCD = '00'")

Dim DT As New DataTable
Dim oda As New OracleDataAdapter(SQL.ToString, connectionstring)
oda.Fill(DT)

以上です。
よろしくお願いいたします。
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2006-09-25 16:57
訂正です。

引用:

どなたか、同様の現象を確認したことがある方、あるいは
この現象の根拠が推測できる方がおられましたら、
書込みをお願いいたします。



書き方が悪かったような気がしています。
どのようなことでも結構ですので、
自由なご意見をお願いいたします。
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-25 17:46
DataAdapterって結局ただの中継役なので、
結局中でCommandとDataReader使ってると思うんですけどね…
(実装見てないので確証ありませんが)

書いてあるコードの範囲では特に問題は見当たらないと思います。

調べるとしたら、
接続先データベースのバージョン、ODP.NETのバージョン
クライアントにインストールしているOracle Clientのバージョン
.NET Frameworkのバージョン、環境変数(ORACLE_HOME)とか
その他諸々…ってとこでしょうか。
m.m.
常連さん
会議室デビュー日: 2003/04/22
投稿数: 20
投稿日時: 2006-09-25 17:53
ODPで実行したのが初めて、OracleClientで実行したのが2回目、
DataReaderで実行したのが3回目以降だとしたら、
2回目以降はDBキャッシュにヒットしたから速くなったとか。

#かなりうがった見方ですけどね
それぞれでの実測定回数が文面からはわからないので。。
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2006-09-25 18:34
返信ありがとうございます。

引用:

vincentさんの書き込み (2006-09-25 17:46) より:
調べるとしたら、
接続先データベースのバージョン、ODP.NETのバージョン
クライアントにインストールしているOracle Clientのバージョン
.NET Frameworkのバージョン、環境変数(ORACLE_HOME)とか
その他諸々…ってとこでしょうか。


@接続先データベースのバージョン
 ・9.2.0.1.0 Oracle9i Release 9.2.0.1.0 - Production
 ・10.1.0.5.0 Oracle Database 10g Release 10.1.0.5.0 - Production
 ふたつのデータベースで検証を行い、
 どちらも同じ結果でした
AODP.netのバージョン
 Oracle.DataAccess.dllのファイルバージョンは「10.1.0.400」です
BOracle Clientのバージョン
 10g Release 1 (10.1.0.2.0) for Windows(だと思います)
C.NET Frameworkのバージョン
 バージョン1.1.4322 SP1
 ※Visual Studio は2003です
A、B、Cに関しては、
適正なバージョンの組み合わせ、あるいは
バージョンの組み合わせによる不具合などがあるかもしれない、
ということでしょうか?
それはどのようにして
調べることが出来るでしょうか?

教えていただけるとありがたいと思います。

よろしくお願いいたします。
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2006-09-25 18:36
返信ありがとうございます。

引用:

ODPで実行したのが初めて、OracleClientで実行したのが2回目、
DataReaderで実行したのが3回目以降だとしたら、
2回目以降はDBキャッシュにヒットしたから速くなったとか。

#かなりうがった見方ですけどね
それぞれでの実測定回数が文面からはわからないので。。



ODPでの実行、OracleClientでの実行を
何度も交互に繰り返していますので、
DBキャッシュの問題ではないと思われます・・

ご意見、ありがとうございました。
fuji
会議室デビュー日: 2004/07/14
投稿数: 12
投稿日時: 2006-09-26 15:32
自己レスです。

取得項目のデータに、NULL値が多く含まれている場合のみ
異常に時間がかかることが分かりました。
(ODPの不具合なんでしょうかね?)

とりあえず今回は、
原因となった項目は取得する必要がなかったため、
この項目を取得しないことで解決することにしました。

返信いただいたみなさま、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)