3

NHibernate は SqlBulkCopy よりも約 5 倍遅いため、バッチ挿入を行うためのものではないことはわかっていますが、コードを簡素化するために使用することにしました。

ただし、私のコードは 5 倍遅くはありません。2400倍遅いです。約2500件のレコードを挿入しています。log4net ロギングをオフにしました。リリースモードで実行しています。私はIDジェネレーターを使用していません(整数カウンターを介してコードで指定しています)。ステートレス セッションを使用しています。バッチ サイズを 100 に設定しました (もっと大きくすることもできますが、役に立たないようです)。ジェネレーターを再度追加しようとしましたが、そのクラスを「割り当て済み」に設定しました。

子要素を挿入していません。バッチ挿入が発生していることを確認しました。

まだ SELECT SCOPE_IDENTITY() を呼び出していますか? しかし、たとえそうだとしても、それはまだばかげた時間です。

私はあまりバッチ操作を行っていないので、このプロセスには引き続き SqlBulkCopy を使用できますが、アプリケーション全体の実行速度が向上するのではないかと心配しています。

NHProf のライセンスを持っていませんが、今が試用版をダウンロードする時期ではないかと考えています。

私は Syscache2 で NHibernate 3.3 GA を使用していますが、ここでもステートレス セッションを使用しています。

見たい HBM、構成、またはコードはありますか? 提案?

ありがとう

4

3 に答える 3

2

SqlBulkCopy よりも約 5 倍遅いため

冗談じゃないわ。

NHibrnate は挿入を行います。バッチ化された挿入 (つまり、コマンド内の複数の挿入ステートメント) を使用して、手書き - NHibernate が行うとは思わないこと - 特定のプロジェクトで約 400 の挿入を取得しました。

SqlBUlkCopy を使用すると、75000 になりました。

これは 5 倍ではなく、187 倍です。

ただし、私のコードは 5 倍遅くはありません。2400倍遅い

NHibernate のスペシャリストではありません。接続をログに記録します - NHibernate がバッチごとに 1 つの挿入を送信すると仮定します。これは、処理が非常に遅くなることを意味し、私が行ったもの (テキストの冒頭) よりもはるかに遅いことを意味します。

一体どこから 5x ファクターを取得したのですか? それはそもそも間違ったスタートです。

私はあまりバッチ操作を行っていないので、このプロセスには引き続き SqlBulkCopy を使用できますが、アプリケーション全体の実行速度が向上するのではないかと心配しています。

ここに現実のチェックがあります。極端な選択または挿入速度が必要な場合は、ORM を使用しません。それらは、ビジネス ルールの重いオブジェクト (ビジネス オブジェクト) のために存在します。一括挿入または一括読み取りを行う場合は、完全な ORM を使用しないでください。そのように単純です。

SqlBUlkCopy が高速であると思われる場合は、これを確認してください: * 複数のスレッドで複数の SqlBulkCopy を実行しています... * ...一時テーブルに挿入し、次に * ...1 つの insert into select ステートメントを使用してデータを最終テーブルにコピーします。

なんで?SqlBulkCopy には、マルチスレッドに対して不適切なロック動作があるためです。こんな感じで高くなりました。

AND: SqlBulkCopy では 2500 行は少ない - セットアップのオーバーヘッドが大きい (つまり、1 行目の前)。したがって、得られる利益は少なくなります。私は5万行のバッチを使用しています。

NHibernate はワイヤ レベルで何をしているのですか?

バッチ挿入が発生していることを確認しました。

どのように?バッチ挿入とは何だと思いますか?

テーブルにトリガーはありますか?

于 2012-06-08T05:59:14.490 に答える
0

多くの挿入を行っていると、ファースト レベル キャッシュが詰まり、すぐにクロールが遅くなることがわかりました。ステートレス セッションを試して使用するか、定期的に、つまり 5 回の挿入ごとにセッションを開いたり閉じたりすることができます。もちろん、セッションを閉じることでトランザクションなどを失うことになります。

しかし、最終的には、挿入する行が約 100 行を超える場合は、何倍も速く SqlBulkCopy を使用する傾向があります。

于 2012-06-12T06:51:07.993 に答える
0

いくつかの長いプロパティと文字列プロパティを持つ 10000 個のオブジェクトを devmashine のローカル mysql データベースに挿入するには:

StatelessSession:  4,6 seconds
Session:           5,7 seconds
于 2012-06-12T06:45:20.403 に答える