質問

Fluent Nhibernateを使用してOracleデータベースにアクセスするASP .NET MVCアプリケーションがあります。また、nhibernateプロファイラーを使用して、Nhibernateによって生成されたクエリを監視しています。非常に簡単なクエリが1つあります(4文字列の列があるテーブルからすべての行を選択します)。 CSV形式でレポートを作成するために使用されます。私の問題は、クエリの実行に非常に時間がかかっていることであり、NHPROFによって表示された期間についてもう少し洞察を得たいと思います。 65.000行では、「データベースのみ」の期間が20ミリ秒のようなものしか表示されないにもかかわらず、10〜20秒かかります。ネットワークラグは、サーバーが同じギガビットLAN上にあるため、この時間の多くを作成するべきではありません。私は人々がボトルネックがどこにあるかを正確に特定できることを期待していませんが、私が知りたいのは、Nhibernateプロファイラーの持続時間測定を読む方法についての詳細です。

「データベースのみ」部分に含まれるものと、「合計時間」に含まれるものは何ですか?合計時間には、C#オブジェクトに登録された後に行われた処理も含まれていますか?今回は実際にはHTTP要求全体のものですか?これについてもっと知ることで、いくつかの要因を排除できることを願っています。

これは、nhibernateマッピングクラスが次のように見えるものです。

Table("V_TICKET_DETAILS");

CompositeId()
     .KeyProperty(x => x.TicketId, "TICKET_ID")
     .KeyProperty(x => x.Key, "COLUMN_NAME")
     .KeyProperty(x => x.Parent, "PARENT_NAME");

 Map(x => x.Value, "COLUMN_VALUE");

そして、NHプロファイラーによって生成されたクエリは次のようなものです。

SELECT this_.TICKET_ID    as TICKET1_35_0_,
       this_.COLUMN_NAME  as COLUMN2_35_0_,
       this_.PARENT_NAME  as PARENT3_35_0_,
       this_.COLUMN_VALUE as COLUMN4_35_0_
FROM   V_TICKET_DETAILS this_

ビューは非常にシンプルで、2桁の整数で2つのテーブルのみに参加しています。

私は決してデータベースの専門家ではないので、正しい方向に私を指し示すすべてのコメントに満足しています。

役に立ちましたか?

解決

合計時間は、nhib Queryのみの呼び出しのみです。
ただし、DBの時間に加えて、エンティティを埋めるのにnhibがかかる時間(水和)が含まれます。そして、それはおそらくあなたの犯人です。
私が持っていました 同様の問題, 、おそらくそこにある提案のいくつかはあなたを助けるかもしれません。

一番下の行は、Nhibが実際に大きなデータセットをロードすることを意図していないということです。
私が手に入れた提案のどれも助けにならないなら、私はいくつかのことを提案します:
1.ユーザーが65,000行のデータを同時に表示する必要がある可能性は低いです。おそらく、結果セットが小さくなるようにデータをフィルタリングする方法を見つけることができます(そして読みやすくなります)。
2.そうでなければ、あなたが言うように、あなたがレポートを生成したときにのみ発生する「特別な」ケースである場合 - あなたはnhibを使用する必要はありません。たとえば、古き良きol 'ado.netクラスを使用することができます...

他のヒント

もあります IStatelessSession このような状況を目的としています。セッションキャッシュがなく、多くの作業を節約します。それははるかに速いはずです。

using (var session = factory.OpenStatelessSession())
{
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top