增加Azure上的SQL批量复制速度

时间:2017-09-01 16:03:49

标签: c# sql-server azure sqlbulkcopy

我正在开发一个项目,我必须将本地应用程序移动到Azure。我们有一个上传实用程序,可将大约150,000条记录传输到Web应用程序(MVC App)。不幸的是,我迁移到Azure后遇到了超时问题。我做了一些更改,包括使用SqlBulkCopy和商店程序而不是SqlCommand。现在,超时问题已得到解决,但数据上传大约需要5分钟才能将150,000条记录上传到Azure上的表中。

我在Azure上使用试用版,而我的数据库DTU是20.现在,由于成本原因,我希望将其保持在20。我的预算很少,我正在与之合作。注意,数据库大小不是问题。我远低于配额。

关于如何减少插入150,000条记录的时间的任何建议?

代码示例

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
                    {
                        bulkCopy.BulkCopyTimeout = 0;
                        bulkCopy.BatchSize = 10000;
                        bulkCopy.ColumnMappings.Add("Barcode", "Barcode");
                        bulkCopy.ColumnMappings.Add("SubCategory", "SubCategory");
                        bulkCopy.ColumnMappings.Add("ItemDescription", "ItemDescription");
                        bulkCopy.ColumnMappings.Add("CreateDate", "CreateDate");
                        bulkCopy.ColumnMappings.Add("RevisedDate", "RevisedDate");

                        bulkCopy.DestinationTableName = "Items";
                        try
                        {
                            bulkCopy.WriteToServer(dtTblData);
                            destinationConnection.Close();
                        }
                        catch (Exception ex)
                        {
                            this.Logs.Add(DateTime.Now.ToString() + ": " + ex.Message);
                        }
                    }
                }

仅供参考:在插入操作期间,我的数据库的DTU达到100%。

2 个答案:

答案 0 :(得分:1)

使用选项SqlBulkCopyOptions.TableLock可以提高效果。

因此,如果你可以锁定桌子,你应该毫无疑问地使用它。

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.TableLock))
{
    // ...code...
}

在此配置之外,由于您已经使用了SqlBulkCopy,因此您可以做很多事情。瓶颈是您的数据库性能,由于预算不能升级。

答案 1 :(得分:0)

除了Jonathan提到的表锁定之外,提高性能的唯一真正方法是增加服务的DTU。

但是,您不需要永久地将数据库保留在更高的设置上,如果此批量加载是不频繁的操作,您可以临时提升数据库的DTU,执行加载,然后降低DTU。您只需按实际上传时间的较高费率收费。

您可以使用Azure SDK类中的Microsoft.Azure.Management.Sql.DatabasesOperationsExtensions和函数更改数据库,并使用RequestedServiceObjectiveId设置a higher tier objective值(您使用的是20个DTU)现在是一个S1目标,你可以在传递给更新函数的gcloud firebase test android run \ --type robo \ --app app/build/outputs/apk/*debug.apk \ --device model=NexusLowRes,version=26 \ --timeout 5m \ --robo-directives text:authui_sign_in_username_edit_text=username \ --robo-directives text:authui_sign_in_password_edit_text=password \ --robo-directives click:authui_sign_in_button= 对象上移动到S2(50 DTU)。