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

kubo [E-MAIL ADDRESS DELETED]
2009年 9月 29日 (火) 17:16:36 JST


久保(jflute)です。

西山さん、こんにちは

20秒はちょっと異常ですね。
情報を整理させて下さい。

まず、コストターゲットがSQL実行なのかマッピングなのか?
っていうところですが、既に自前の実装だと遅くならない
とのことですが、その自前の実装はバインド変数を利用して
の実行と考えてよろしいでしょうか?
Yesならマッピングでほぼ確定かと思いますのでOKです。

そして、実際に「while (dataReader.Read()) {」のループが遅い
とのことですが、ループ内のそれぞれの処理でどれが遅いのか
計って頂けますでしょうか?
(具体的に一つ一つの処理の時間を計測願います)

<A>
columnNames = CreateColumnNames(dataReader.GetSchemaTable());
※最初の一回だけ実行される

<B>
columns = CreateColumnMetaData(columnNames);
※最初の一回だけ実行される

<C>
Object row = CreateRow(dataReader, columns);
※毎ループ実行される

<D>
その他リレーション周りの処理
※親テーブル(基点テーブル)のみの取得なので実行されないはず
  --> skipRelationLoopがtrueのはず

2009/9/29 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
> お世話になっております。
> 西山(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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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