Is bulk update faster than single update in db2?

后端 未结 5 1353
星月不相逢
星月不相逢 2021-01-25 00:59

I have a Table with 10 columns and in that table I have thousands/millions of rows. In some scenario, I want to update more than 10K records at a time. currently my scenario cod

5条回答
  •  半阙折子戏
    2021-01-25 01:21

    If you are using .NET (and there's probably a similar option in other languages like Java), there is a option you can use on your DB2Connection class called BeginChain, which will greatly improve performance.

    Basically, when you have the chain option activated, your DB2 client will keep all of the commands in a queue. When you call EndChain, the queue will be sent to the server at once, and processed at one time.

    The documentation says that this should perform much better than non-chained UPDATE/INSERT/DELETEs (and this is what we've seen in my shop), but there are some differences you might need to be aware of:

    • No exceptions will be thrown on individual statements. They will all be batched up in one DB2Exception, which will contain multiple errors in the DB2Error property.
    • ExecuteNonQuery will return -1 when chaining is active.

    Additionally, performance can be improved further by using a query with Parameter Markers instead of separate individual queries (assuming status can change as well, otherwise, you might just use a literal):

    UPDATE tab1 
    SET status = @status
    WHERE id   = @id
    

    Edit for comment: I'm not sure if the confusion is in using Parameter Markers (which are just placeholders for values in a query, see the link for more details), or in the actual usage of chaining. If it is the second, then here is some example code (I didn't verify that it works, so use at your own risk :)):

    //Below is a function that returns an open DB2Connection
    //object. It can vary by shop, so put it whatever you do.
    using (var conn = (DB2Connection) GetConnection())
    {
        using (var trans = conn.BeginTransaction())
        {
            var sb = new StringBuilder();
            sb.AppendLine("UPDATE tab1 ");
            sb.AppendLine("   SET status = 'HISTORY' ");
            sb.AppendLine(" WHERE id = @id");
    
            trans.Connection.BeginChain();
    
            using (var cmd = trans.Connection.CreateCommand())
            {
                cmd.CommandText = sb.ToString();
                cmd.Transaction = trans;
    
                foreach (var id in ids)
                {
                    cmd.Parameters.Clear();
                    cmd.Parameters.Add("@id", id);
                    cmd.ExecuteNonQuery();
                }    
            }
    
            trans.Connection.EndChain();         
            trans.Commit();
        }
    }
    

提交回复
热议问题