B-Tree จะปรับสมดุลในระหว่างการลบข้อมูลจากตาราง SQL Server ที่มีดัชนีคลัสเตอร์หรือไม่?


10

ฉันมีตารางในฐานข้อมูล SQL Server ที่มีดัชนีคลัสเตอร์ในคีย์หลัก ตารางมี 1 ล้านแถว หากฉันลบแถว 10K ออกจากตารางดัชนีจะถูกปรับโครงสร้างใหม่ในระหว่างการดำเนินการลบหรือไม่?

การดำเนินการลบเป็นส่วนหนึ่งของกระบวนงานที่เก็บไว้ ในแต่ละครั้งลูกค้ามากกว่าหนึ่งรายสามารถเรียกใช้งานโพรซีเดอร์ที่เก็บไว้ได้อย่างไรก็ตามการรันแต่ละรายการจะลบชุดของแถวเอง (ระบุโดยคีย์หลัก) ฉันกำลังปิดกั้นคีย์ล็อค (ประเภท U) เมื่อลูกค้าหลายรายดำเนินการตามขั้นตอน ล็อคบล็อคเป็นของแถวจากตารางเดียวกันและไม่ได้เป็นส่วนหนึ่งของการทำธุรกรรมใด ๆ ที่ทำงานพร้อมกัน ไม่ควรมีการบล็อกใด ๆ เนื่องจากการรันแต่ละครั้งพยายามลบมันเป็นชุดของแถว การยกระดับการล็อคไม่ได้เกิดขึ้นเนื่องจากปิดอยู่

ฉันสงสัยว่าการดำเนินการลบจะต้องทำให้ดัชนีมีการปรับสมดุลและดังนั้นในระหว่างกระบวนการปรับโครงสร้างจึงสามารถใช้การล็อคปุ่มบนแถวใดก็ได้ของตาราง

ฉันขอขอบคุณความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้


คำถามที่ดีและเดาดี ใช่เมื่อคุณลบบันทึกดัชนีจะถูกสร้างใหม่ ระหว่างการสร้างตารางกระบวนการใหม่จะเป็นการล็อคและผู้ใช้รายอื่นจะไม่สามารถเข้าถึงตารางนั้นได้ stackoverflow.com/questions/6309614/…
KumarHarsh

4
ไม่การลบแถวในดัชนีคลัสเตอร์ไม่ทำให้เกิดการสร้างดัชนีใหม่ คุณสามารถโพสต์แบบสอบถามที่ใช้ในการลบข้อมูลได้หรือไม่ ล็อค U มาเมื่อพยายามค้นหาข้อมูลซึ่งจะถูกลบและในที่สุดก็ล็อคแถวเพื่อลบมัน
Shanky

2
เมื่อการลบเกิดขึ้นระบบจะสร้าง "หลุม" หรือคุณสามารถบอกช่องว่างในขณะที่ข้อมูลถูกลบออกจากดัชนีคลัสเตอร์ สิ่งนี้อาจสร้างความหนาแน่นของหน้ากระดาษต่ำและถือได้ว่าเป็นการแตกแฟรกเมนต์ เมื่อการแทรกเกิดขึ้นบน CI มันจะเติมเร็กคอร์ดทางด้านขวาและเนื่องจากพื้นที่นี้อาจไม่เต็ม แต่ SQL Server จะไม่ลบพื้นที่นี้โดยอัตโนมัติ คุณต้องสร้างดัชนีใหม่หรือจัดระเบียบใหม่เพื่อเติมช่องว่างนี้ ไม่มีการปรับสมดุลเช่นนี้
Shanky

1
@jayesh ฉันไม่เห็นว่าลำดับของโหนดในต้นไม้เกี่ยวข้องกับการปรับสมดุลอย่างไร ทรี B สามารถไม่สมดุลกันได้ (อาจเกิดจากส่วนแทรกหรือลบ) ลำดับโหนดจะไม่เปลี่ยนแปลงในกรณีเหล่านี้ มันเป็นต้นไม้ที่ไม่สมดุล
ypercubeᵀᴹ

1
@jayesh ฉันคิดว่าคุณอาจได้รับประโยชน์จากการอ่านเอกสาร MSSQL บางส่วนเนื่องจากฉันคิดว่าคำศัพท์ที่คุณใช้กำลังสับสนทั้งคุณและพวกเราบางคน
LowlyDBA

คำตอบ:


3

ในการตอบคำถามในชื่อไม่ว่าจะเป็น B-tree ปรับสมดุลในระหว่างการลบคำตอบดูเหมือนจะไม่อย่างน้อยในกรณีทดสอบขั้นต่ำต่อไปนี้

การสาธิตต่อไปนี้เรียกใช้คำสั่งที่ดีที่สุดสำหรับสภาพแวดล้อมการทดสอบ

--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

การสาธิตนี้แสดงให้เห็นว่าการลบสามารถสร้างทรี b-tree ที่ไม่สมดุลโดยมีข้อมูลทั้งหมดอยู่ด้านเดียว


ขอบคุณสำหรับคำอธิบายที่ชัดเจนและรัดกุมและรหัสการสาธิต ฉันจะลองทำดู ฉันจะยอมรับคำตอบนี้ ฉันยังคงพยายามหาสาเหตุว่าทำไมการลบชุดแถวที่ไม่ปะติดปะต่อทำให้เกิดการบล็อกในตารางด้วยดัชนีคลัสเตอร์
jayesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.