2016-06-23 13 views
0

私のCSVのサイズは4GBで、SQLサーバにインポートする必要があります。 私はそれが2000万行以上あると思います。何人かが1時間以内にこれを行う方法を私に教えたら、私はとても感謝しています。私はすでにやっている何をDBへの大きなCsvファイル

using (FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read)) { 
     using (StreamReader reader = new StreamReader(filestream, Encoding.UTF8)) { 

      string line = ""; 
      bool isHeader = true; 
      int counter = 0; 

      while ((line = reader.ReadLine()) != null) { 

       if (isHeader) { 
        model.Columns = line.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries); 
        isHeader = false; 
        continue; 
       } else { 

        if (Settings.Default.RonudSet != 0) { 
         LoadInDB(indicator,RoundDecimals(line)); 
        } else { 
         LoadInDB(indicator, line); 
        } 
       } 
       cmd.ExecuteNonQuery(); 
       counter++; 
      } 
} 
      model.RowCount = counter; 
      model.ColumnsCount = model.Columns.Length; 
     } 
    } 
    return model; 
} 

マイDbのアップロード方法:

public void LoadInDB(char indicator, string key) { 

     using (SqlConnection conn = new SqlConnection(Settings.Default.DBconnection)) { 

      conn.Open(); 
      try { 

       SqlCommand cmd = new SqlCommand("dbo.LipperFilesTestingInsertFileRowKey", conn); 

       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add(new SqlParameter("@FileRowKey", SqlDbType.NVarChar, 100)); 
       cmd.Parameters["@FileRowKey"].Value = key; 

       cmd.Parameters.Add(new SqlParameter("@targetTableIndicator", SqlDbType.NVarChar, 100)); 
       cmd.Parameters["@targetTableIndicator"].Value = indicator; 

       cmd.ExecuteNonQuery(); 

      } catch (SqlException sqlExc) { 

       MyLog.WriteToLog(sqlExc.Message,MyLog.Messages.Error); 
      } 
     } 
    } 

答えて

0
  1. あなたは新しい接続あなたが行を挿入するたびに開くべきではありません。それはあなたのパフォーマンスを破壊するでしょう。ファイルを読み始める前に接続を開いて、最後にファイルを閉じます。
  2. トランザクションを使用します。 SqlConnection.BeginTransactionを検索してください。これにより、DB側のパフォーマンスが向上します。トランザクションがなければ、SQL Serverは各挿入をコミットしますが、これは無駄です。
  3. この全体のデータロード方法を廃止し、代わりにSQL ServerのBULK INSERT機能を使用することを検討してください。
+1

さらに、データセットとデータアダプタを介してデータをアップロードすることもできます。通常、個々の更新を遅くするのは、ログがフラッシュされるまでの待ち時間であり、それを考慮する必要があります。最も簡単な解決策は、バッチコミットだけです。例えば。 1000回の挿入ごと、または1秒ごとにコミットします。これにより、ログ・ページがいっぱいになり、トランザクション内のすべての挿入に対してコスト・ログ・ログ・フラッシュ待ち時間が償却されます。パフォーマンステストの場合と同様に、ランダム性を排除し、データベースとログをあらかじめ割り当てておくことをお勧めします.dbまたはログの増加イベントを回避する必要はありません。 –

関連する問題