我正在开发一个项目,我必须将本地应用程序移动到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%。
答案 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)。