[seasar-dotnet:1498] [DBFlute] InternalBeanListMetaDataResultSetHandler の dataReader.Readの部分で時間がかかる。

西山 はじめ [E-MAIL ADDRESS DELETED]
2009年 9月 29日 (火) 13:30:48 JST


お世話になっております。
西山(hajimeni)です。

DBFluteを利用してSQLクエリーを実行した時に、なぜか時間がか
かってしまいます。
同じクエリーを自力で構築して実行した際には、時間がかかること
が無く、原因追求に戸惑っています。

デバッグで追ってみたところ、
InternalBeanListMetaDataResultSetHandlerクラス、
Handleメソッド内の
while (dataReader.Read()) {
・・・
部分で時間がかかっているようでした。

DBFlute内で作成されたDbCommoandやDbParameter、DbConnectionと
同等のものを自力で作った際には、dataReader.Reader部分でも時
間がかからず処理されています。

お手数ですが、調査方法等、何かアドバイスしていただけると幸い
です。


[環境]
DB: Oracle9.2.0.5
.NET: 2.0
開発環境: VisualBasic 2008
DBFlute.NET: 0.8.9.2
接続: DataDirect Connect for ADO.NET 3.2

DBFluteでの実行時間:
  約20秒程度(ログから)
自力でCommand、Readerを構築したときの実行時間
  1〜2秒程度

///////////////
[親テーブル]1:n[子テーブル]n:1[別テーブル]

[親テーブル]  7,000件
[子テーブル] 60,000件
[別テーブル]  2,000件

というテーブルで、親テーブルを結果として取得する為に
子テーブルをExistsSubQueryにし、
別テーブルの検索条件で絞り込んでいます。
これに対して1000件絞込みまで行っています。

Dim cb As New 親テーブルCB()
cb.Query().Deleted_Equal_False()
cb.Query().
  Exists別テーブルList(AddressOf GetAddressOfSubQuery)

Function GetAddressOfSubQuery() As SubQuery(Of 子テーブルCB)
  subCB.Query().SetDeleted_Equal_False()
  subCB.Query().Query別テーブル().
     SetName_LikeSearch(_name,
       New LikeSearchOption().LikeContain())
End Function

[SQL]
///////////////
SELECT
 親テーブル.ID
FROM 親テーブル
WHERE 親テーブル.DELETED = '0'
  AND EXISTS (SELECT 子テーブル.ID
              FROM 子テーブル
                LEFT JOIN 別テーブル ON 子テーブル.ID = 別
テーブルID
              WHERE 子テーブル.PARENT_ID = 親テーブル.ID
                AND 子テーブル.DELETED = '0'
                AND 別テーブル.NAME LIKE '%あああ%' ESCALE '|')
///////////////
テーブル名は、置換させてもらっております。


以上よろしくお願いいたします。

-- 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 西山 はじめ
++++++++++++++++++++++++++++++++++++++++++++++++++++++++



seasar-dotnet メーリングリストの案内