একটি ক্লাস্টার ইনডেক্সের সাথে এসকিউএল সার্ভার টেবিল থেকে ডেটা মুছে ফেলার সময় কি বি-ট্রি পুনরায় ভারসাম্যহীন?


10

আমার কাছে একটি এসকিউএল সার্ভার ডাটাবেসে একটি প্রাথমিক ক্লাবের ক্লাস্টারড ইনডেক্স রয়েছে। টেবিলটিতে 1 মিলিয়ন সারি রয়েছে। আমি যদি টেবিল থেকে 10 কে সারি মুছে ফেলি, মোছা অপারেশন চলাকালীন সূচি পুনর্গঠন করা হয়?

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

আমার সন্দেহ, মুছে ফেলা অপারেশন অবশ্যই সূচককে ভারসাম্য বজায় রাখছে এবং তাই পুনর্গঠন প্রক্রিয়া চলাকালীন এটি টেবিলের যে কোনও সারিতে মূল লক নিতে পারে take

আমি এই বিষয়ে কোন মতামত সত্যিই প্রশংসা করব।


দুর্দান্ত প্রশ্ন এবং দুর্দান্ত অনুমান। হ্যাঁ, আপনি যখন রেকর্ডটি মুছবেন তখন সূচিটি আবার তৈরি করা হবে। পুনর্নির্মাণ প্রক্রিয়া চলাকালীন টেবিলটি লক হয় এবং অন্যান্য ব্যবহারকারী সেই টেবিলটি অ্যাক্সেস করতে সক্ষম হন না। stackoverflow.com/questions/6309614/...
KumarHarsh

4
না, ক্লাস্টার ইনডেক্সে সারিগুলি মোছার ফলে সূচি পুনর্নির্মাণের কারণ হয় না। আপনি কি ডেটা মুছতে ব্যবহৃত ক্যোয়ারী পোস্ট করতে পারেন। ইউ লক আসে যখন ক্যোয়ারী এমন ডেটা সন্ধান করার চেষ্টা করে যা মুছে ফেলা হবে এবং শেষ পর্যন্ত মুছে ফেলার জন্য সারিগুলিকে একচেটিয়াভাবে লক করে।
শানকি

2
মুছুন যখন ঘটে তখন এটি একটি "ছিদ্র" তৈরি করে বা ক্লাস্টার ইনডেক্স থেকে ডেটা সরানো হওয়ায় আপনি স্থান বলতে পারেন। এটি কম পৃষ্ঠার ঘনত্ব তৈরি করতে পারে এবং খণ্ডিত হিসাবে বিবেচনা করা যেতে পারে। যখন সিআইতে সন্নিবেশ ঘটে তখন এটি ডানদিকে রেকর্ডগুলি পূরণ করবে এবং এর কারণে কখনই স্থানটি পূরণ করা যাবে না। তবে এসকিউএল সার্ভার স্বয়ংক্রিয়ভাবে এই স্থানটি সরাবে না। এই স্থানটি পূরণ করতে আপনাকে পুনর্নির্মাণ করতে হবে বা পুনর্গঠন করতে হবে। এর মতো কোনও পুনরায় ভারসাম্য নেই
শ্যাঙ্কি

1
@ জয়েশ আমি দেখতে পাচ্ছি না যে গাছের নোডের ক্রমটি কীভাবে পুনরায় ভারসাম্যের সাথে জড়িত। একটি বি-গাছ ভারসাম্যহীন হতে পারে (হয় সন্নিবেশ বা মোছার কারণে)। এই ক্ষেত্রে নোড আদেশ পরিবর্তন হয় না। এটি কেবল একটি ভারসাম্যহীন গাছ।
ypercubeᵀᴹ

1
@ জয়েশ আমার মনে হয় আপনি এমএসএসকিউএল ডক্সের কিছুটা পড়ে আপনারা উপকৃত হতে পারেন, যেহেতু আমি মনে করি আপনি যে পরিভাষাটি ব্যবহার করছেন তা আপনার এবং আমাদের উভয়কেই বিভ্রান্ত করছে।
লোলিডিবিএ

উত্তর:


3

শিরোনামে প্রশ্নের উত্তর দেওয়ার জন্য, বি-ট্রি একটি মুছার সময় পুনরায় ভারসাম্যহীন কিনা, অন্তত নিম্নলিখিত ন্যূনতম পরীক্ষার ক্ষেত্রে উত্তরটি হ'ল না বলে মনে হচ্ছে।

নিম্নলিখিত পরিবেশনের জন্য কমান্ডগুলি চালিত হয় যা পরীক্ষার পরিবেশের জন্য সবচেয়ে ভাল থাকে।

--create table and fill it
DROP TABLE IF EXISTS bunchesofints
CREATE TABLE bunchesofints (
thisisanint INT PRIMARY KEY CLUSTERED,
junkrow CHAR(1000) NOT NULL
)

INSERT dbo.bunchesofints
SELECT TOP 5000
ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS thisisanint,
REPLICATE('a',1000) AS junkrow
FROM sys.all_objects a1
CROSS JOIN sys.all_objects a2


--with this query we can see all the non-leaf pages of the b-tree, plus the IAM
SELECT allocated_page_page_id, page_type_desc, page_level, is_allocated, next_page_page_id, previous_page_page_id
FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID('dbo.bunchesofints'),NULL,NULL,'DETAILED')
WHERE page_type != 1
GO

--Ok, let's delete most of the rows
;WITH CTE AS (
    SELECT TOP (4500) *
    FROM dbo.bunchesofints
    ORDER BY thisisanint DESC
)

DELETE 
FROM CTE
GO

--Hmm, still have 3 non-leaf index pages
SELECT allocated_page_page_id, page_type_desc, page_level, is_allocated, next_page_page_id, previous_page_page_id
FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID('dbo.bunchesofints'),NULL,NULL,'DETAILED')
WHERE page_type != 1



--So, where are the rows?
--please note the assumption that your test database has a single file.
DECLARE @firstindexpage INT, @lastindexpage INT, @db INT = DB_ID()
SELECT @firstindexpage = MIN(previous_page_page_id), @lastindexpage = MAX(next_page_page_id)
FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID('dbo.bunchesofints'),NULL,NULL,'DETAILED')
WHERE page_type = 2 AND page_level = 1

DBCC PAGE(@db,1,@firstindexpage,3) WITH TABLERESULTS
DBCC PAGE(@db,1,@lastindexpage,3) WITH TABLERESULTS

এই ডেমোটি দেখায় যে একটি মোছা একটি ভারসাম্যহীন বি-ট্রি উত্পাদন করতে পারে, প্রায় একদিকে সমস্ত ডেটা সহ।


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