【发布时间】:2018-07-23 14:59:56
【问题描述】:
我有一个表,表 B,外键指向表 A。两个表都比较大。
在表 B 的更新过程中,我首先禁用约束,更新内容,然后启用约束。
ALTER TABLE B NOCHECK CONSTRAINT ALL;
-- Update table b
ALTER TABLE B WITH CHECK CHECK CONSTRAINT ALL;
问题是最后一行需要一段时间才能运行 10-15 分钟,而且在运行时,从表 A 中读取数据真的很慢! Web 应用程序需要表 A,运行时应用程序将超时。
第一个问题:为什么会这样?我认为这只是表 A 上的共享锁,不会阻塞其他读取。
第二个问题:如何避免这种情况?
谢谢!
【问题讨论】:
-
这似乎是一个问题,答案取决于您使用的数据库的类型/版本。那么您介意为此添加标签吗?例如,行级锁定并非无处不在。
-
我相信只有 SQL Server 使用那种奇怪的 WITH CHECK CHECK 语法:)
-
此 dba.SE 发布创建了一种情况,即使用 NOCHECK 选项重新启用约束将允许无效数据保留在表中:dba.stackexchange.com/questions/167861/…
标签: sql sql-server performance stored-procedures foreign-keys