12

NHibernateInsertのパフォーマンスの向上に取り組んでいるのは数日です。

ステートレスセッションは1秒あたり1000〜2000レコードのように挿入できるという多くの投稿(この記事など)を読みました。しかし、1243レコードを挿入できる最適な時間は、私にとって9秒以上です。

var sessionFactory = new NHibernateConfiguration().CreateSessionFactory();
using (IStatelessSession statelessSession = sessionFactory.OpenStatelessSession())
{
   statelessSession.SetBatchSize(adjustmentValues.Count);

   foreach (var adj in adjustmentValues)
      statelessSession.Insert(adj);
}

クラス :

public partial class AdjustmentValue : PersistentObject, IFinancialValue
{
    public virtual double Amount { get; set; }
    public virtual bool HasManualValue { get; set; }
    public virtual bool HasScaleValue { get; set; }
    public virtual string Formula { get; set; }
    public virtual DateTime IssueDate { get; set; }

    public virtual CompanyTopic CompanyTopic { get; set; }
}

クラスの地図:

public class AdjustmentValueMap : ClassMap<AdjustmentValue>
{
    public AdjustmentValueMap()
    {
       Id(P => P.Id);

       Map(p => p.Amount);
       Map(p => p.IssueDate);
       Map(p => p.HasManualValue);
       Map(p => p.HasScaleValue);
       Map(p => p.Formula);

       References(p => p.CompanyTopic)
           .Fetch.Join();
    }
}

私は何かが足りないのですか?インサートをスピードアップする方法はありますか?

ここに画像の説明を入力してください

生成されるクエリは次のようになります。

ここに画像の説明を入力してください

4

2 に答える 2

20

NHProfの結果の外観から、POIDとしてIDを使用しています。したがって、バッチ書き込みを利用することはできません。すべての挿入/更新/削除は個別のコマンドです。だから時間がかかるのです。

POIDをhilo、guid、またはguid.combに変更し、バッチサイズを500または1000に設定すると、書き込み時間が大幅に改善されます。

于 2011-12-19T15:57:50.060 に答える
5

SQLServer2008を使用していると想定しています。

頭に浮かぶことはほとんどありません。エンティティの主キーとしてIDキー(サンプル出力でSCOPE_IDENTITY()を選択)を使用していますか?はいの場合、オブジェクトが実際にデータベースに保存される前に、NHibernateは各オブジェクトに対してSCOPE_IDENTITY()呼び出しを実行する必要があると思います。したがって、1000個のオブジェクトを挿入する場合、Nhibernateは1000個のINSERTステートメントと1000個のselect SCOPE_IDENTITY()ステートメントを生成します。

100%確信はありませんが、バッチ処理が中断する可能性もあります。NHProfを使用しているので、それは何と言っていますか?すべてのステートメントが一緒にバッチ処理されていることを示していますか、それともNHProf UIで個々のINSERTステートメントを選択できますか?挿入がバッチ処理されていない場合は、NHProfに「大量の個別書き込み」アラートが表示される可能性があります。

編集:

IDの生成を変更できない場合は、SqlBulkCopyを使用できます。データ移行でNHibernateと一緒に使用しましたが、機能します。Ayende Rahienのブログには、あなたが始められるサンプルがあります。

于 2011-12-19T15:43:59.717 に答える