我们在SQLServer2008SSIS标准服务器中有一个非常大的表,通过将行复制到单独磁盘上的另一个数据库中,然后使用SSIS数据流从原始表中删除它们来归档行。该表有一个bigint主键,并将按该键的数字顺序删除行。但是,由于我正在删除行,表的总体索引大小正在稳步增加,而且我不知道原因。在整个过程中,数据大小保持不变。
以下是表中的详细信息:
行数:~300 000 000
数据大小:~65 GB
索引大小:~65 GB
正在以每小时35万左右的速度删除行。
列定义使用以下数据类型: smallint、int、bigint、char、varchar、nvarchar、unique标识符、位、日期时间。
该表有一个主键,即表上的聚集键,以及4个非聚集索引。
该表也是复制维护计划的一部分。表的复制副本在数据大小和索引大小上都在减少!
上周,我在另一个表上执行了相同的处理,当我删除行时,我可以看到该表的数据大小和索引大小都在减少。
在这种情况下,是否有任何解释来解释为什么索引的大小会持续上升?
发布于 2014-02-25 19:47:55
好的,我相信您正在做,INSERT正在增加大小,然后在执行OLEDB命令之后,它将向Server发送数十万个DELETE命令,这是导致您的问题的原因。下面是一个关于如何更有效地执行这个DELETE操作的简短演示/教程。即使这不能解决您的索引问题,它也会使您的包更有效地运行。
步骤1:为这些信息构建一个暂存表。
您需要CREATE一个表,它唯一的目的是保存删除所需的列。无论你的主键是什么都行。
步骤2:截断暂存表。

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

步骤3:数据流任务。
接下来,添加数据流任务并打开。

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

步骤3:删除


如果你有其他问题的话,这应该会让你对如何做到这一点有一个很好的想法-请随便问。
这样做效率更高的原因是,您当时正在执行基于集的操作,而不是将350 K DELETE命令发送到SQL server。
https://dba.stackexchange.com/questions/59636
复制相似问题