2017-07-06 4 views
-1

私はこれでしたので、私は「TU」テーブル列「HashText」の無重複レコードをテーブルに挿入バルクに「TU」と「TUV」(多くの関係1)をしようとしています:2つの関連するテーブルの重複レコードを除いて、エンティティ・フレームワークを使用して一括挿入するベスト・ウェイ「時間の短縮」?

/// <summary> 
    /// Check if the selected TranslationUnit is exsists at db. 
    /// </summary> 
    /// <param name="translationUnit"></param> 
    /// <returns></returns> 
    public bool CheckDuplicate(TranslationUnit translationUnit) 
    { 

     int FoundedTusCount = db.TUs.Where(tu => tu.HashText == translationUnit.Hash && TmIDList.Any(tm => tm == tu.TMID)).Count(); 
     if(FoundedTusCount > 0) 
     { 
      return true; 
     } 
     return false; 
    } 

これはをDBへの多くの接続と多くの時間。その後

)addRangeを(使用してデータベースにこのようなすべての10000(接続時間を節約)レコードが残っ項目を挿入します。これは、保存機能である

  foreach (TranslationUnit item in Options.TMXFile.Data.Body.TranslationUnits.ToList()) 
      { 
       TU tu = FillTU(TMID, item); 
       ReadyTUs.Add(tu); 
       tu.TUVs = new List<TUV>(); 
       foreach (TranslationUnitVariant item1 in item.TranslationUnitVariants) 
       { 
        tu.TUVs.Add(FillTUV(item1)); 
       } 
       if (ReadyTUs.Count >= 10000) 
       { 
        Save(); 
       } 
      } 
      Save(); 

を:

private void Save() 
    { 
     db.TUs.AddRange(ReadyTUs); 
     db.SaveChanges(); 
     ReadyTUs.Clear(); 
     db.Dispose(); 
     db = new GTMEntities(); 
    } 

私の主な問題今は時間とDBへの多くの接続ですので、TUとTUVテーブルを一括して挿入する方法があれば、数百万のレコードが含まれています。

+0

1つのアイデアは、ステージングテーブルTU_RAWにすべてを一括挿入することです。次に、ストアドプロシージャを使用してTUに実際の挿入を行います。これは通常、時間を短縮し、db接続を低下させます。 – Jesse

+0

SQL Serverを直接使用できる場合は、Entityフレームワークより高速です –

答えて

0

1つのオプションはSqlBulkCopyです。

基本的に、すべてのデータをステージングテーブルに一括して挿入します。

次に、メインテーブルとステージングテーブルと、一致するステージングテーブルのすべてのレコードをDELETEに結合します。

次に、INSERTをステージテーブルからSELECT DISTINCTの結果で実表に挿入します。

関連する問題