Ich werde Sie durch ein Beispiel führen, damit Sie sehen können, warum es lange gedauert hat. Erstellen einer leeren Datenbank für diesen Test.
CREATE DATABASE [TestFK]
GO
2 Tabellen erstellen.
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
Erstellen einer Fremdschlüsseleinschränkung für die Personentabelle.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Fügen Sie einige Daten in beide Tabellen ein.
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
Öffnen Sie ein neues Abfragefenster und führen Sie dieses aus (schließen Sie das Fenster nicht, wenn die Abfrage abgeschlossen ist).
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
Öffnen Sie ein anderes Abfragefenster und führen Sie dieses aus.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Sie werden feststellen, dass die Drop-Einschränkung weiterhin ausgeführt wird (wartet), und führen Sie nun die Abfrage aus, um festzustellen, warum sie länger ausgeführt wird und auf welche Sperren sie wartet.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Sobald Sie Ihre Einfügeoperation festgeschrieben haben, wird die Drop-Einschränkung sofort abgeschlossen, da die Drop-Anweisung jetzt die erforderliche Sperre erhalten kann.
In Ihrem Fall müssen Sie sicherstellen, dass keine Sitzung über eine kompatible Sperre verfügt, um zu verhindern, dass die Drop-Einschränkung die erforderlichen Sperren erhält.