12

NHibernateの挿入パフォーマンスの改善に取り組んでいます。NHibernateのステートレスセッションの挿入が遅い

私はしかし、それは1243件のレコードを挿入することができることを最高の時間がのためのより9秒です.... ステートレスセッションは、毎秒1000〜2000年、レコードのように挿入できること(例えばthis oneなど)の多くの記事で読みました私:

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(); 
    } 
} 

私に何かが不足していますか? インサートをスピードアップする方法はありますか?

enter image description here

生成されたクエリは以下と同じになります。

enter image description here

答えて

17

はあなたのPOIDとしてのアイデンティティを使用している結果。したがって、一括書き込みを利用することはできません。挿入/更新/削除はすべて別のコマンドです。だからこそ長い時間がかかります。あなたはヒロ、GUIDまたはguid.combにあなたのPOIDを変更して、あなたが書き込み時間の大幅な改善が見られるだろう500または1000にバッチサイズを設定した場合

4

私は、あなたは、SQL Serverの心に来て、2008年

いくつかを使用していると仮定しています。エンティティの主キーとして識別キー(サンプル出力でSCOPE_IDENTITY()を選択)を使用していますか?もしそうなら、私は、オブジェクトが実際にデータベースに保存される前に、各オブジェクトのSCOPE_IDENTITY()呼び出しをNHibernateが実行しなければならないと思います。したがって、1000のオブジェクトを挿入する場合、Nhibernateは1000のINSERT文と1000のSCOPE_IDENTITY()文を生成します。

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

編集:

あなたはあなたのアイデンティティの生成を変更することができないならば、あなたはSqlBulkCopyを使用することができます。私はデータの移行でNHibernateとそれを使用し、それが動作します。 Ayende Rahien has sample on his blogあなたを始めましょう。あなたのNHProfのルックスから

+0

はい、挿入は個別のクエリです。 –

+1

時間が問題となるバルクインサートの場合、私は実際には 'SQLBulkCopy'ソリューションのために行きます。 – Rippo

関連する問題