标签: heap-table

SQL Server - 删除/更新堆中的 LOB 数据

我有一个启用了 RCSI 的 SQL Server 2016 数据库,它实际上是一堆堆。除了一张表之外,数据库中的所有其他表都是一个堆,最大的堆约为 200GB,占数据库总大小的 50% 以上。

\n\n

这个特定的大堆有两个 lob 列,均为 varbinary(max) 数据类型。堆还有许多非聚集索引,幸运的是 varbinary(max) 列不存在于任何这些非聚集索引中,因此它们的大小相对较小。

\n\n

供应商提供了一个清理脚本,该脚本从应用程序服务器运行并从这个大堆中清除数据。经过一番调查,我发现此清理脚本不会删除整行,而是根据某些条件将 varbinary(max) 列之一设置为 null。

\n\n

以下是有关堆的一些详细信息:

\n\n

在此输入图像描述

\n\n
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(N\'<database>\'), OBJECT_ID(N\'GrimHeaper>\'),0, null, \'DETAILED\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

在此输入图像描述

\n\n
SELECT * FROM sys.dm_db_index_operational_stats(db_id(\'<database>\'),object_id(\'GrimHeaper\'),0,null);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

在此输入图像描述

\n\n

在此输入图像描述

\n\n

我对这种情况的理解是,通过将 lob 列中的值设置为 null 释放的空间不会自动重新声明,无论表是堆还是聚集表,都是这种行为,如果我错了,请纠正我。

\n\n

在这篇 Microsoft文章以及这篇文章中,它阐述了以下有关索引重组操作的内容:

\n\n
\n

REORGANIZE ALL 对所有索引执行 LOB_COMPACTION。对于每个索引,这会压缩聚集索引、基础表中的所有 LOB 列或非聚集索引中包含的列。

\n\n

指定 ALL 时,将重新组织与指定表或视图关联的所有索引,并压缩与聚集索引、基础表或包含列的非聚集索引关联的所有 LOB 列。

\n
\n\n

我觉得这些说法含糊不清,不是很清楚。任何人都可以确认,如果我运行 \xe2\x80\x9cALTER INDEX ALL ON REORGANIZE WITH …

sql-server blob lob sql-server-2016 heap-table

3
推荐指数
1
解决办法
2213
查看次数

Azure SQL 是否支持堆或者仍然需要聚集索引?

我发现了很多旧文档,例如2010 年的本页,介绍了 SQL Azure 如何需要聚集索引并且不支持没有聚集索引的表。

然而,10年后,情况仍然如此吗?我找不到任何清晰的、更新的文档。

这份 2016 年文档讨论了“堆(没有聚集索引的表)”,并且适用于 SQL Server 和 Azure SQL 数据库。因此,我猜测现在支持没有聚集索引的表。是这样吗?我希望看到它更清楚地记录它。

请注意,这不是一般的软件推荐请求 - 这是一个非常实际的是或否类型的问题。

clustered-index azure-sql-database heap-table

0
推荐指数
2
解决办法
559
查看次数