বিদেশী কী বাদ দেওয়া কেন বেশি সময় নেয়?


13

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা একবারে একটি করে ডাটাবেস থেকে সমস্ত বিদেশী কী মুছে দেয়, ঠিক এর মতো:

ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2

আমাকে কী আশ্চর্য করে তা হ'ল স্ক্রিপ্টটি দীর্ঘ সময় নেয়: প্রতিটি ড্রপ এফকে জন্য গড়ে 20 সেকেন্ড। এখন, আমি বুঝতে পেরেছি যে এফকে তৈরি করা একটি বড় ব্যাপার হতে পারে, কারণ সার্ভারে গিয়ে পরীক্ষা করে দেখতে হবে যে এফকে সীমাবদ্ধতা প্রথম থেকেই লঙ্ঘিত হচ্ছে না, তবে নামছে? এত দীর্ঘ সময় লাগে এমন এফকে ফেলে দেওয়ার সময় সার্ভার কী করবে? এটি আমার নিজের কৌতূহলের জন্য এবং জিনিসগুলি দ্রুত করার কোনও উপায় আছে কিনা তা বোঝার জন্য both এফকে অপসারণ করতে সক্ষম হওয়া (কেবল তাদের অক্ষম নয়) মাইগ্রেশনের সময় আমাকে আরও দ্রুত হতে দেয়, এবং তাই ডাউনটাইম হ্রাস করে।


1
হতে পারে অন্য কোনও প্রক্রিয়া আপনার ডাটাবেসে ভাগ করে নেওয়া স্কিমা লকগুলি রাখে, ড্রপ এফকে প্রক্রিয়াটি শেষ হওয়ার জন্য অপেক্ষা করতে বাধ্য করে? ড্রপ এফকে চালানোর চেষ্টা করুন এবং তারপরে অবরুদ্ধ করার জন্য অবিলম্বে sp_ who2 পরীক্ষা করুন।
ড্যানিয়েল হুটমাচার

আমি উল্লেখ করতে ভুলে গেছি, এই ডাটাবেসে আর কোনও প্রক্রিয়া চলছে না। তবে একই সার্ভারে অন্যান্য ডাটাবেসে রয়েছে।
carlo.borreo

উত্তর:


12

সীমাবদ্ধতা ফেলে দেওয়ার জন্য একটি Sch-M (স্কিমা মডিফিকেশন) লক প্রয়োজন যা সংশোধনকালে টেবিলটি জিজ্ঞাসা করতে অন্যকে অবরুদ্ধ করে দেবে। আপনি সম্ভবত সেই লকটি পাওয়ার অপেক্ষায় রয়েছেন এবং সেই টেবিলের বিরুদ্ধে সমস্ত চলমান অনুসন্ধান শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে।
চলমান ক্যোয়ারিতে টেবিলে একটি Sch-S (স্কিমা স্থিতিশীলতা) লক থাকে এবং সেই লকটি কোনও Sch-M লকের সাথে সঙ্গতিপূর্ণ নয়।

লক মোডগুলি থেকে , স্কিমা লকগুলি

ডাটাবেস ইঞ্জিনটি একটি টেবিল ডেটা সংজ্ঞা ভাষা (ডিডিএল) ক্রিয়াকলাপের সময় স্কিমা পরিবর্তন (স্ক-এম) লক ব্যবহার করে যেমন কলাম যুক্ত করা বা একটি টেবিল বাদ দেওয়া। এটি অনুষ্ঠিত হওয়ার সময়, এস-এম লকটি টেবিলে একযোগে অ্যাক্সেসকে বাধা দেয়। এর অর্থ এস-এম লকটি লকটি প্রকাশ না হওয়া পর্যন্ত বাইরের সমস্ত ক্রিয়াকলাপ অবরুদ্ধ করে।

কিছু ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (ডিএমএল) ক্রিয়াকলাপ, যেমন টেবিলের কাটা, সমবর্তী ক্রিয়াকলাপ দ্বারা প্রভাবিত টেবিলগুলিতে অ্যাক্সেস রোধ করতে Sch-M লকগুলি ব্যবহার করে।

ডেটাবেস ইঞ্জিন কোয়েরিগুলি সঙ্কলন ও সম্পাদন করার সময় স্কিমা স্থিতিশীলতা (Sch-S) লক ব্যবহার করে। এস-এস লকগুলি এক্সক্লুসিভ (এক্স) লক সহ কোনও লেনদেনের লকগুলিকে অবরুদ্ধ করে না। সুতরাং, কোনও টেবিলের এক্স লকযুক্তগুলি সহ অন্যান্য লেনদেনগুলি চলতে থাকে, যখন কোনও প্রশ্নের সংকলন করা হচ্ছে। তবে, একযোগে ডিডিএল ক্রিয়াকলাপ, এবং সম-ডিএমএল অপারেশনগুলি যা Sch-M লকগুলি অর্জন করে, টেবিলে সম্পাদন করা যায় না।


কখনও কখনও এসএসএমএসে টেবিলটি হাইলাইট করা একটি Sch-Sলক তৈরি করে দেয় এবং আমি সন্দেহ করি এটিই ওপি'র সমস্যাগুলির মূল কারণ।
জন আইজব্রেনার

5

আমি আপনাকে একটি উদাহরণ দিয়ে যাব যাতে আপনি দেখতে পাচ্ছেন যে এটি কেন দীর্ঘ সময় নিচ্ছে। এই পরীক্ষার জন্য একটি খালি ডাটাবেস তৈরি করা হচ্ছে।

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; 

একবার আপনি নিজের সন্নিবেশ অপারেশন করলে, ড্রপ সীমাবদ্ধতা অবিলম্বে সম্পূর্ণ হবে কারণ এখন ড্রপ স্টেটমেন্ট প্রয়োজনীয় লকটি অর্জন করতে পারে acquire

আপনার ক্ষেত্রে আপনার নিশ্চিত করতে হবে যে কোনও সেশনে একটি সামঞ্জস্যপূর্ণ লক নেই যা প্রয়োজনীয় লক / লকগুলি অর্জনের জন্য ড্রপ সীমাবদ্ধতা রোধ করবে।


অন্য কেউ ডাটাবেস ব্যবহার করছিল না, তবে অন্যদিকে, আমি বাদ দিতে পারি না যে এই ডেটাবেজে আমার একটি খোলা উইন্ডো ছিল। আমি আরেকটি পরীক্ষা করবো।
carlo.borreo

1
আপনার ড্রপ স্টেটমেন্টটি শেষ হওয়ার অপেক্ষায় থাকাকালীন অন্য উইন্ডো থেকে এই কোয়েরিটি চালান। এটি আপনাকে দেবে যা আপনি অপেক্ষা করছেন। থেকে ক্যোয়ারী করুন এখানে । এটি আমার উদাহরণে আমি যা দিয়েছিলাম তার চেয়ে বেশি বিশদ রয়েছে।
স্কেল ওয়ার্ল্ডওয়াইড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.