簡體   English   中英

減少處理大量數據時的插入語句時間

[英]reducing insert statement time when dealing with large amount of data

我讀到有關SqlBulkCopy的信息,它可以減少插入大量行時所用時間的方式,我的情況是:我有一個excel文件,希望將其轉換為dataTable,然后將此dataTable發送到存儲過程(希望我無法更改其代碼),將dataTable中的所有行插入數據庫中的sql表

問題是我要插入1萬到5萬行,是否有什么辦法可以減少存儲過程所花費的時間?

最好的方法是使用SqlBulkCopy將數據添加到臨時表中,然后將其提供給存儲的proc。 您將需要編寫一些SQL代碼來進行處理,但是以這種方式執行所帶來的性能好處應該值得付出。

如果創建一個新的存儲過程,那么您將具有在數據庫引擎內部運行所有這些代碼的額外好處,因此您將不會在應用程序和數據庫引擎之間來回切換。

一些代碼:

    var importData = new DataSet();
    xmlData.Position = 0;
    importData.ReadXml(xmlData);

    using (var connection = new SqlConnection(myConnectionString))
    {
      connection.Open();
      using (var trans = connection.BeginTransaction())
      {
        using (var sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, trans) { DestinationTableName = myTableName })
        {
          foreach (DataColumn col in importData.Tables[0].Columns)
          {
            sbc.ColumnMappings.Add(col.ColumnName, col.ColumnName);
          }

          sbc.WriteToServer(importData.Tables[0]); //table 0 is the main table in this dataset

          // Now lets call the stored proc.
          var cmd = new SqlCommand("ProcessDataImport", connection)
              {
                CommandType = CommandType.StoredProcedure
              };
          cmd.CommandTimeout = 1200;
          cmd.ExecuteNonQuery();

          trans.Commit();
        }
        connection.Close();
        return null;
      }
    }

其中XmlData是具有與批量導入匹配的Xml數據的流,而myTableName包含要導入到的表。 記住,進行批量復制時,列名必須匹配100%。 案例也很重要。

該過程看起來像這樣:

CREATE PROCEDURE [ProcessDataImport]
AS
BEGIN
  DECLARE @IMPORTCOL INT

  WHILE EXISTS (SELECT X FROM TEMPTABLE)
  BEGIN
    SELECT @IMPORTCOL = (SELECT TOP 1 COLUMN1 FROM TEMPTABLE)
    EXEC DOTHEIMPORT @IMPORTCOL
    DELETE FROM TEMPTABLE WHERE COLUMN1 = @IMPORTCOL
  END
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM