Te explicaré un ejemplo para que puedas ver por qué estaba tomando tanto tiempo. Crear una base de datos vacía para esta prueba.
CREATE DATABASE [TestFK]
GO
Creando 2 tablas.
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
Creación de una restricción de clave externa en la tabla Persona.
USE [TestFK]
GO
ALTER TABLE dbo.Person ADD CONSTRAINT FK_Person_AddressID FOREIGN KEY (AddressID)
REFERENCES dbo.Address(AddressID)
GO
Inserte algunos datos en ambas tablas.
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
Abra una nueva ventana de consulta y ejecútela (no cierre la ventana una vez que se complete la consulta).
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
Abra otra ventana de consulta y ejecute esto.
USE [TestFK]
GO
ALTER TABLE dbo.person DROP CONSTRAINT FK_Person_AddressID
Verá que la restricción de caída continuará ejecutándose (esperando) y ahora ejecutará la consulta para ver por qué se está ejecutando por más tiempo y qué bloqueos está esperando.
SELECT * FROM sys.dm_os_waiting_tasks
WHERE blocking_session_id IS NOT NULL;
Una vez que confirme su operación de inserción, la restricción de caída se completará inmediatamente porque ahora la declaración de caída puede adquirir el bloqueo requerido.
Para su caso, debe asegurarse de que ninguna sesión tenga un bloqueo compatible que evite la restricción de caída para adquirir los bloqueos / bloqueos necesarios.