예제를 통해 설명하겠습니다. 왜 오랜 시간이 걸 렸는지 알 수 있습니다. 이 테스트를 위해 빈 데이터베이스를 만듭니다.
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 문이 필요한 잠금을 획득 할 수 있으므로 드롭 제약 조건이 즉시 완료됩니다.
귀하의 경우 필요한 잠금 / 잠금을 획득하기 위해 드롭 제한을 방지하는 호환 가능한 잠금을 보유하는 세션이 없는지 확인해야합니다.