मैं आपको एक उदाहरण के माध्यम से चलता हूं, तो आप देख सकते हैं कि इसमें लंबा समय क्यों लग रहा था। इस परीक्षण के लिए एक खाली डेटाबेस बनाना।
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
व्यक्ति तालिका पर एक विदेशी कुंजी बाधा बनाना।
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;
एक बार जब आप अपना इंसर्ट ऑपरेशन कर लेते हैं, तो ड्रॉप बाधा तुरंत पूरी हो जाएगी क्योंकि अब ड्रॉप स्टेटमेंट आवश्यक लॉक हासिल कर सकता है।
आपके मामले के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि कोई सत्र संगत लॉक नहीं कर रहा है, जो आवश्यक अवरोध / ताले प्राप्त करने के लिए ड्रॉप बाधा को रोक देगा।