4

これはFluentNHibernateを使用して行われています

1つのテーブルからデータを取得するNHibernateルックアップがあります。生成されたSQLを取得し、クエリアナライザーで実行すると、実行に約18ミリ秒かかります。

NHProfilerを使用すると、このクエリの期間は〜1800msになります-SQLの100倍です!

Query duration
 - Database only:1800ms
 - Total: 1806ms

移入されているオブジェクトには子クラスが含まれていますが、この子はNHibernateの第2レベルのキャッシュからロードされています

返されるデータはページングされます(クエリごとに50)が、私が知る限り、これは何の違いもありません。

また、カウントを実行しています。これも、クエリアナライザで最大4ミリ秒、NHProfilerによると最大1800ミリ秒かかります。

NH Profilerは、クエリの実行時間、またはクラスを取得、マッピング、オブジェクトグラフを作成するための完全な時間を表示していますか?前者の場合、クエリを直接実行するよりもはるかに時間がかかるのはなぜですか?

編集:NHプロファイラーで指定されたクエリ期間の値に関するAyendeによるこの投稿を見つけました:http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx-それは間違いなくです時間がかかっているデータベースのクエリ

4

2 に答える 2

8

ついに問題を突き止めることができた。

オブジェクトの主キーは、データベース内のvarcharです。NHibernateは、クエリを実行したときに値をnvarcharに変換していました。残念ながら、NH Profilerで生成されたSQLを見ると、これは明らかではありませんでした。速度低下は、SQLがnvarcharをvarcharに変換することによって引き起こされました

カスタムタイプを使用するようにマッピングを指定しました

map.Id(x => x.Id).CustomType("AnsiString");

そして問題は解決されます

すべての助けの人々に乾杯:)

于 2010-02-17T12:25:52.657 に答える
1

通常、これらの問題は、ユーザーとデータベース間のネットワークで解決されます。QAは通常、データベースに直接接続し、送信する必要があるのは、フォーマットされた場所に生データを戻すことだけです。アプリはおそらく、結果セットをデータセットまたは同様の構成に変換しています。これを証明するには、SQLデータリーダーを使用してデータを読み取るように(データレイヤー全体ではなく)コードを少し変更します。すべての列を解析してデータを保存しようとせずに、すべてのレコードを読み取るだけです。それはおそらくあなたのネットワークがそれを可能にするのと同じくらい速く実行するでしょう。

于 2010-02-16T13:12:28.583 に答える