ในการตอบคำถามในชื่อไม่ว่าจะเป็น 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 ที่ไม่สมดุลโดยมีข้อมูลทั้งหมดอยู่ด้านเดียว