[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 メーリングリストの案内