Ozzie Asked: 2015-07-21 06:29:16 +0800 CST2015-07-21 06:29:16 +0800 CST 2015-07-21 06:29:16 +0800 CST 从表中清除数据的最佳方法是对性能的损害最小? 772 当您从数据库表中清除记录并删除它们时,您会影响目标表的逻辑和物理结构,以及索引和统计信息。 海量记录删除后的表应该进行哪些维护? sql-server performance 2 个回答 Voted Best Answer Aaron Bertrand 2015-07-21T06:39:37+08:002015-07-21T06:39:37+08:00 您可以重建或碎片整理,具体取决于已删除数据的性质、索引的数量以及它们受到的影响程度。如果您在删除之前知道碎片,则很容易从sys.dm_db_index_physical_stats;评估增量。如果您不这样做,那么您可以在确定是否进行碎片整理、重建或都不进行碎片整理时应用通常的规则。(您也可以花时间查看sys.dm_db_index_operational_stats并sys.dm_db_index_usage_stats验证您的所有索引是否都是必要的并且正在使用。有时最好的办法是删除索引。) 您还可以将删除分成块(请参阅本文),并在其间执行增量维护,这样您最终的维护将是最小的。这可能比单个操作更具侵入性,但它会在更长的时间内分解成更小的突发。 Micah Nikkel 2015-07-21T08:14:13+08:002015-07-21T08:14:13+08:00 海量记录删除后的表应该进行哪些维护? 当执行像这样的大删除时,SQL Server 实际上并不会立即为您从页面中删除数据。它将它们标记为逻辑删除,然后幽灵清理任务将在后台运行时将它们删除。也就是说,这里有两个问题你可以问自己: 表是否有聚集索引? 如果是这样,重建它将删除已删除的行。如果没有,并且您不想要一个,请考虑构建一个然后将其移除。否则,堆表可能会遇到各种问题,例如转发行等。 这是一张大桌子吗? 您已经提到它是,因此 SQL Server 自动更新的统计信息是不够的。您将需要执行定期 UPDATE STATISTICS 以让 SQL Server 对数据进行采样(或强制全面扫描)并相应地更新统计信息。作为替代方案,可以考虑重建表索引,作为触发相关统计信息更新的一种方式。 下一步: 查看您的表上是否有/想要一个聚集索引并进行任何必要的更改。然后,重建您的聚集索引(如果有意识地决定将其保留为堆表,则重建非聚集索引)。在重建聚集索引时,它也会导致非聚集索引的重建。这是因为如果表上存在非聚集索引,则非聚集索引会指向聚集索引。
您可以重建或碎片整理,具体取决于已删除数据的性质、索引的数量以及它们受到的影响程度。如果您在删除之前知道碎片,则很容易从
sys.dm_db_index_physical_stats
;评估增量。如果您不这样做,那么您可以在确定是否进行碎片整理、重建或都不进行碎片整理时应用通常的规则。(您也可以花时间查看sys.dm_db_index_operational_stats
并sys.dm_db_index_usage_stats
验证您的所有索引是否都是必要的并且正在使用。有时最好的办法是删除索引。)您还可以将删除分成块(请参阅本文),并在其间执行增量维护,这样您最终的维护将是最小的。这可能比单个操作更具侵入性,但它会在更长的时间内分解成更小的突发。
当执行像这样的大删除时,SQL Server 实际上并不会立即为您从页面中删除数据。它将它们标记为逻辑删除,然后幽灵清理任务将在后台运行时将它们删除。也就是说,这里有两个问题你可以问自己:
表是否有聚集索引?
如果是这样,重建它将删除已删除的行。如果没有,并且您不想要一个,请考虑构建一个然后将其移除。否则,堆表可能会遇到各种问题,例如转发行等。
这是一张大桌子吗?
您已经提到它是,因此 SQL Server 自动更新的统计信息是不够的。您将需要执行定期 UPDATE STATISTICS 以让 SQL Server 对数据进行采样(或强制全面扫描)并相应地更新统计信息。作为替代方案,可以考虑重建表索引,作为触发相关统计信息更新的一种方式。
下一步:
查看您的表上是否有/想要一个聚集索引并进行任何必要的更改。然后,重建您的聚集索引(如果有意识地决定将其保留为堆表,则重建非聚集索引)。在重建聚集索引时,它也会导致非聚集索引的重建。这是因为如果表上存在非聚集索引,则非聚集索引会指向聚集索引。