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

Posted

技术标签:

【中文标题】为啥在尝试删除违反外键约束的记录时,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 应用程序的性能会受到如此大的影响? 【发布时间】:2015-08-18 18:43:48 【问题描述】:

为什么在尝试删除违反外键约束的记录时,Azure Web 应用程序的性能会受到如此大的影响?我知道,“不要那样做。”让我感到惊讶的是,它可能是一个如此巨大的因素。

我有一个 Azure 网站,每小时运行大约 125K 请求,它连接到 Azure SQL S2 数据库,每天大约 8GB 吞吐量,其中大部分是在正常工作时间。在 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 会消除此类问题吗?

【问题讨论】:

SQL Server 是如何允许的呢?如果您在本地执行此操作会发生什么? 【参考方案1】:

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

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

大多数级联删除引用都针对少量记录,但其中一个引用了总共 600,000 条记录的表中的 135,000 条记录。

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

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

【讨论】:

以上是关于为啥在尝试删除违反外键约束的记录时,Azure Web 应用程序的性能会受到如此大的影响?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA hibernate中删除表遇到主键被外键引用,违反完整约束条件,不能删除的问题 2张表,一张主表user,有

转:使用DBUnit测试时违反外键约束的解决办法

Laravel 删除(违反完整性约束)

完整性错误:更新或删除违反外键约束。 Django + PostgreSQL

关于oracle删除外键的问题,看看下面的语句为啥不能执行。

Vapor fluent 不会在违反外键约束时抛出