2011-03-01 52 views
2

我想插入大約3000條記錄,當我走近方法1時,需要大約2分鐘才能完成,但是如果我使用方法2插入完成小於秒。雖然方法2不遵循良好的實踐,但它給了我很好的性能收益。想了解爲什麼方法1需要這麼多時間,纔會有更好的方法來做到這一點爲什麼在一個命令中通過單個插入執行多個插入時會有顯着的性能增益

方法1:

public static void InsertModelValue(DataSet employeData, int clsaId) 
{ 
    var query = @"INSERT INTO employee (id, name) 
        VALUES (@id, @name)"; 
    using (var connection = GetOdbcConnection()) 
    {      
     connection.Open();     
     var tran = connection.BeginTransaction(); 
     try 
     {     

      foreach (DataRow row in employeData.Tables[0].Rows) 
      {      
       using (var cmd = new OdbcCommand(query, connection, tran)) 
       { 
        cmd.Parameters.Add("@id", OdbcType.VarChar).Value = row["ID"]; 
        cmd.Parameters.Add("@name", OdbcType.Int).Value = Convert.ToInt32(row["Name"]); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     }      
    }   
} 

方法2:

public static void InsertModelValueInBulk(DataSet employeData, int clsaId, int batchSize) 
{   
    string[] insertStatement = new string[batchSize]; 
    using (var connection = GetOdbcConnection()) 
    { 
     connection.Open(); 
     var tran = connection.BeginTransaction(); 
     try 
     {        
      int j = 0; 
      for (int i = 0; i < employeData.Tables[0].Rows.Count; i++) 
      { 
       var row = employeData.Tables[0].Rows[i];  
       var insertItem = string.Format(@"select '{0}',{1}", row["name"], Convert.ToInt32(row["ID"]); 
       insertStatement[j] = insertItem; 
       if (j % (batchSize-1) == 0 && j > 0) 
       { 
        var finalQuery = @" INSERT INTO employee (id, name) 
    " + String.Join(" union ", insertStatement); 
        using (var cmd = new OdbcCommand(finalQuery, connection, tran)) 
        { 
         cmd.ExecuteNonQuery(); 
        } 
        j = 0; 
        continue; 
       } 
       else 
       { 
        j = j + 1; 
       } 
      } 

      if (j > 0) 
      { 

       var finalQuery = @"INSERT INTO employee (id, name) 
    " + String.Join(" union ", insertStatement,0,j-1); 
       using (var cmd = new OdbcCommand(finalQuery, connection, tran)) 
       { 
        cmd.ExecuteNonQuery(); 
       } 
      } 

      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 
+2

答案在於代碼本身。在第一種方法中,您正在從您的應用程序到SQL進行多個調用。在2方法中,您使用查詢進行單一調用。運行SQL Profiler,您將會了解其中的差異。 – sajoshi 2011-03-01 07:38:24

+4

可能是一個愚蠢的問題,但你看看這個:[使用DataAdapter(ADO.NET)執行批處理操作](http://msdn.microsoft.com/en-us/library/aadf8fk2​​.aspx)。這基本上是你在第二種方法中所做的,只是更正確。 – R0MANARMY 2011-03-01 19:16:24

+0

感謝羅馬納米你回答了它 – 2011-03-02 03:39:38

回答

26

你要存3您的銀行賬戶中有一千美元。這是更快:

  • 等待出納員
  • 拿一塊錢出來你的錢包
  • 出示證件到出納員
  • 存款美元
  • 去行
  • 結束
  • 重複整個過程2999多次,然後回家。

  • 等待出納員
  • 拿三千塊錢了你的錢包
  • 出示證件到出納員
  • 存款的三千元
  • 回家吧

應該很明顯,第一個比第二個慢得多。現在清楚爲什麼第一種技術比第二種技術慢數百倍?

+2

+1,這個答案讓我的一天:) – Axarydax 2011-03-01 07:40:16

+0

是 - 非常好的比喻。 – Justin 2011-03-01 07:41:23

+0

+1,很棒的比喻。順便說一句,三千美元應該在一美元的賬單:) – SWeko 2011-03-01 07:49:03

相關問題