SqlBulkCopy *VERY* 在 Azure SQL 和 C# 上很慢



我正在使用SqlBulkCopy和FastMember将记录插入sql

在本地,我可以在大约 100 秒内插入 2k 条记录。当我在 Azure Web 应用程序 Web 作业和 Azure Sql 数据库上运行它时,它花费了 10 多分钟,并且事务超时。表定义相同,表中的数据量相似等。没有锁,只是很慢。当我在本地运行它并尝试写入 Azure Sql 数据库时,也需要> 10 分钟。

实际调用非常简单:

using(var bulkCopy = new SqlBulkCopy(connection){DestinationTableName="Table")
using(var reader = ObjectReader.Create(entities, columnList)
{
   await bulkCopy.WriteToServerAsync(reader).ConfigureAwait(false);
}

我尝试使用TransactionScope(Suppress)删除交易,但这没有任何区别。

谁能帮助我知道我犯了什么愚蠢的错误,或者给我一些关于如何诊断的提示?这真的很令人沮丧!时间差异如此之大,以至于我确信我在这里错过了一些基本的东西。

嗯。我删除了所有索引,这产生了一些差异,但批处理仍然在 10 分钟超时。我删除了外部环境事务范围(而不是使用TransactionScope.Suppress(,突然之间,时间看起来又"正常"了。插入大约需要 50 秒,并且在运行时越来越接近 DTU 的最大值,而之前它只达到大约 20%。

我仍然不知道为什么它在 2 秒内与环境事务一起在本地工作,但它必须是一个可以积累的经验

感谢所有回答的人 - 至少为我指明了一个学习的好方向!

可以运行以下查询,以验证在该工作负载运行时是否存在较高的日志写入百分比:

SELECT 
    (COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats

还可以使用本文中介绍的不同方法之一收集与该工作负载关联的等待。在执行该工作负载期间,您可能会看到与 IO 相关的等待时间很高。

若要避免在执行高 IO 密集型工作负荷期间出现限制,可以在运行它们之前纵向扩展,并在工作负荷完成后缩减到初始层。

ALTER DATABASE [db1] MODIFY (EDITION = 'Premium', SERVICE_OBJECTIVE = 'P15');

最新更新