为什么在命令中对单个插入进行多次插入时会有显着的性能提升

Bri*_*hra 2 .net c# ado.net

我想插入大约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;
        }                      
   }          
}
Run Code Online (Sandbox Code Playgroud)

方法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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 26

您想在您的银行帐户中存入三千美元.哪个更快:

  • 等待出纳员
  • 从你的钱包里取出一美元
  • 向出纳员出示你的身份证明
  • 存入美元
  • 走到最后
  • 重复整个过程2999次,然后回家.

要么

  • 等待出纳员
  • 从你的钱包里拿出三千美元
  • 向出纳员出示你的身份证明
  • 存三千美元
  • 回家

应该相当明显的是,第一个比第二个慢很多.现在很清楚为什么第一种技术比第二种技术慢几百倍?

  • @Brijesh:好的,你读过的那些地方有什么必须说的*为什么*快速的方法是个坏主意? (4认同)