为什么在尝试删除违反外键约束的记录时,Azure Web 应用程序的性能会受到如此大的影响?

Why does Azure web app performance suffer so much when trying to delete a record that violates a foreign key constraint?

为什么在尝试删除违反外键约束的记录时,Azure Web 应用程序的性能会受到如此大的影响?我知道,"Don't do that." 这可能是一个如此巨大的因素,这让我感到惊讶。

我有一个 Azure 网站 运行 大约 125K requests/hour 它连接到 Azure SQL S2 数据库大约 8GB throughput/day 其中大部分是在正常工作时间内.在 Azure 门户图表中,网站通常在白天占用 40% CPU 和 50% 的内存。数据库平均约占 15% CPU 和 30 - 40% 数据 I/O 和日志 I/O.

我试图使用 Mgt Studio 删除违反外键约束的记录。该网站遭受了巨大损失——正在处理的请求数量下降得很低,CPU 达到峰值,http 队列长度变得非常高,Autoscale 添加了另一个实例,许多 http 服务器错误开始发生,许多客户端报告超时和 502 错误网关错误。

我花了几分钟来识别问题并取消查询,取消查询又花了三分钟,网络应用程序需要 10-15 分钟才能赶上。

我的问题是,这是对外键违规的正常响应吗?我是否在数据库或 Web 服务代码中存在某些结构错误,导致 Mgt 中的外键违规错误造成如此广泛的灾难性影响?工作室?升级到 Azure Sql V12 会消除此类问题吗?

这很可能是数据库性能问题。

我试图删除的记录被多个外键约束引用,大多数是删除级联但一个不是。

大多数级联删除引用都针对少量记录,但在 table 中引用了 135,000 条记录,总共有 600,000 条记录。

另一个级联删除可能引用了 table 中的少量记录,记录很少,但每个记录中可能有 10-15MB 大小的 blob。我不知道我试图删除的记录引用了多少(如果有的话)。

我猜它一直在执行级联删除,直到它遇到 table 没有级联删除的删除并且不得不回滚所有内容。换句话说,网站的扩展问题很可能是因为数据库性能受到影响。 Azure 的这一方面令人失望。当我们在 Windows Server 2003 虚拟机上本地提供这些服务时,Sql Server 2005 具有数倍的数据,数据库的响应速度要快得多。也许升级到 Azure Sql V12 会有所帮助。