首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在删除具有聚集索引的Server表中的数据时,B树是否重新平衡?

在删除具有聚集索引的Server表中的数据时,B树是否重新平衡?
EN

Database Administration用户
提问于 2018-04-18 19:31:59
回答 1查看 689关注 0票数 11

我在Server数据库中有一个表,其中包含主键上的聚集索引。该表有100万行。如果我从表中删除10K行,是否在删除操作期间执行索引重组?

删除操作是存储过程的一部分。同时,多个客户端可以执行存储过程,但是每个单独的运行都将删除它自己的一组行(由主键唯一标识)。当多个客户端执行该过程时,我会阻塞密钥锁(类型为U)。拦截器锁属于同一表中的一行,它不是任何并发运行的事务的一部分。不应该有任何阻塞,因为每次运行都试图删除它自己的一组行。当锁被关闭时,锁升级不会发生。

我怀疑,删除操作一定是导致索引重新平衡,因此在重组过程中,它可以对表的任何行进行键锁。

我非常感谢你对此发表任何意见。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-04-20 13:48:21

要回答标题中的问题,即B树是否在删除期间重新平衡,答案似乎是否定的,至少在下面的最小测试案例中是这样的。

下面的演示运行最好留给测试环境的命令。

代码语言:javascript
复制
--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-树,几乎所有的数据都在一边。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/204382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档