C# 提高Azure上的SQL批量复制速度

C# 提高Azure上的SQL批量复制速度,c#,sql-server,azure,sqlbulkcopy,C#,Sql Server,Azure,Sqlbulkcopy,我正在从事一个项目,在这个项目中,我必须将一个本地应用程序移到Azure。我们有一个上传工具,可以将大约150000条记录传输到web应用程序MVC应用程序。不幸的是,我在迁移到Azure后遇到超时问题。我做了一些更改,包括使用SqlBulkCopy和Store过程,而不是使用SqlCommand。现在,超时问题已经解决,但是数据上传需要大约5分钟才能将150000条记录上传到Azure上的一个表中 我正在Azure上使用试用版,我的数据库DTU是20。现在,由于成本的原因,我想把价格保持在20

我正在从事一个项目,在这个项目中,我必须将一个本地应用程序移到Azure。我们有一个上传工具,可以将大约150000条记录传输到web应用程序MVC应用程序。不幸的是,我在迁移到Azure后遇到超时问题。我做了一些更改,包括使用SqlBulkCopy和Store过程,而不是使用SqlCommand。现在,超时问题已经解决,但是数据上传需要大约5分钟才能将150000条记录上传到Azure上的一个表中

我正在Azure上使用试用版,我的数据库DTU是20。现在,由于成本的原因,我想把价格保持在20美元。我的工作预算很小。注意,数据库大小不是问题。我远远低于配额

关于如何缩短插入这15万条记录的时间,有什么建议吗

代码示例

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%。

使用选项SqlBulkCopyOptions.TableLock将提高性能

因此,如果你能锁定桌子,毫无疑问你应该使用它

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

在这个配置之外,您可以做的事情并不多,因为您已经使用了SqlBulkCopy。瓶颈是由于预算原因而无法升级的数据库性能。

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

但是,您不需要永远将数据库保持在较高的设置上,如果此批量加载是一个不常见的操作,您可以临时提升数据库的DTU,执行加载,然后将DTU降低。你只会在你实际上传的时间以更高的费率付费


您可以使用类中的and函数通过代码更改数据库,并使用您现在使用的20个DTU设置值是S1的目标,您可以在向更新函数传递的数据库对象的大容量加载期间向上移动到S2 50 DTU。

您必须一次上载所有150K吗?您可以尝试以单独的数据表或通过BatchSize属性发送每个10K行的批。如果可能,减少目标表上的索引数量,并按聚集索引的顺序加载。我将batchSize设置为10K。从我在数据库中看到的情况来看,只有PK上有一个索引。感谢您回复PK订购的源数据?不,源数据来自json文件,然后插入到数据表中,然后使用sqlbulkcopy进行复制。如果我遗漏了任何细节,我深表歉意。您可以尝试的一件事是确保DataTable列是强类型的,以匹配目标表,尤其是字符串列的最大长度。默认字符串长度为-1 2GB,这是TVPs的一个问题,但我不确定SqlBulkCopy.Noted。弹性池会做同样的事情还是您的解决方案提供更多的控制?再次感谢。只有当您有多个数据库时,Eleastic pool才有用,您仍然需要支付单个DTU的价格,但DTU可以在多个数据库之间共享,只要它们不是同时都有峰值,它们都可以根据需要上下扩展。