Я пройду вас за прикладом, щоб ви зрозуміли, чому це зайняло тривалий час. Створення порожньої бази даних для цього тесту.
CREATE DATABASE [TestFK]
GO
Створення 2 таблиць.
USE [TestFK]
GO
CREATE TABLE dbo.[Address] (
ADDRESSID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Address1 VARCHAR(50),
City VARCHAR(50),
[State] VARCHAR(10),
ZIP VARCHAR(10));
GO
CREATE TABLE dbo.Person (
PersonID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50) NOT NULL,
FirstName VARCHAR(50),
AddressID INT);
GO
Створення обмеження для зовнішнього ключа на таблиці Person.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Вставте деякі дані в обидві таблиці.
USE [TestFK]
GO
INSERT dbo.Address (Address1,City,[State],Zip)
SELECT '123 Easy St','Austin','TX','78701'
UNION
SELECT '456 Lakeview','Sunrise Beach','TX','78643'
GO
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith','John',1
UNION
SELECT 'Smith','Mary',1
UNION
SELECT 'Jones','Max',2
GO
Відкрийте нове вікно запиту та запустіть це (не закривайте вікно, як тільки запит буде виконано).
USE [TestFK]
GO
BEGIN TRAN
INSERT dbo.Person (LastName,FirstName,AddressID)
SELECT 'Smith1','John1',1
UNION
SELECT 'Smith1','Mary1',1
UNION
SELECT 'Jones1','Max1',2
Відкрийте ще одне вікно запитів і запустіть цей.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Ви побачите, що обмеження упущення буде продовжувати працювати (чекати), а тепер запустіть запит, щоб зрозуміти, чому він працює довше і які замки його чекають.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Після здійснення операції вставки обмеження для падіння завершиться негайно, оскільки тепер оператор drop може придбати необхідний замок.
Для вашого випадку вам потрібно переконатися, що жоден сеанс не підтримує сумісний замок, що запобігає обмеженню падіння для придбання необхідного блокування / блокування.