删除行会增加索引大小

aar*_*lin 4 index delete ssis sql-server-2008-r2 archive

我们在 SQL Server 2008 R2 标准服务器中有一个非常大的表,我通过将它们复制到单独磁盘上的另一个数据库中来存档行,然后使用 SSIS 数据流从原始表中删除它们。该表有一个 bigint 主键,并且正在按照该键的数字顺序删除行。然而,当我删除行时,表的整体索引大小正在稳步增加,我不知道为什么。在整个过程中,数据大小保持不变。


以下是表的详细信息:

行数:~300,000,000
数据大小:~65 GB
索引大小:~65 GB

行正在以每小时约 350,000 的速度被删除。

列定义使用以下数据类型:smallint、int、bigint、char、varchar、nvarchar、uniqueidentifier、bit、datetime

该表有一个主键,即表上的聚集键以及 4 个非聚集索引。

该表也是复制维护计划的一部分。表的复制副本的数据大小和索引大小都在减少!


上周我在另一个表上执行了相同的过程,当我删除行时,我可以看到该表的数据大小和索引大小都在减少。

在这种情况下,是否有任何解释为什么索引大小会不断上升?

Zan*_*ane 10

好吧,所以我相信你正在做并且INSERT正在增加大小,然后在你执行你的 OLEDB 命令之后,这是DELETE导致你的问题的原因。所以这里有一个关于如何DELETE更有效地执行此操作的简短演示/教程。即使这不能解决您的索引问题,它也会使您的包运行更有效。

步骤 1:为此信息构建一个临时表。

您将需要CREATE一个唯一目的是保存删除所需列的表。无论您的主键是什么,都可以。

第 2 步:截断临时表。

创建执行 SQL 任务

首先截断很重要,因为如果包失败,这将全部重新运行。

编辑 SQL 任务

第 3 步:数据流任务。

接下来添加一个数据流任务并打开。

添加 DFT

如果您在其他地方进行存档,请忽略下一个图像中的多播和存档目标。

DFT 说明

第 3 步:删除

删除

删除语句

如果您有任何其他问题,请随时提出,这应该可以让您很好地了解如何执行此操作。

这将更有效的原因是因为您正在执行基于集合的操作,而不是DELETE向 SQL 服务器发送 350K命令。