为啥在尝试删除违反外键约束的记录时,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,有
完整性错误:更新或删除违反外键约束。 Django + PostgreSQL