放下一张大桌子

seb*_*eid 7 sql-server sql-server-2008-r2

在我们的生产数据库中有一个 180 GB 的表,大约有 200 万条记录,我想将它重新创建为新文件组中的新空表并删除现有表。在不影响数据库性能的情况下执行此任务的最佳实践是什么?

我的时间将用于重命名和删除表。

我想补充一点,这是一个非常高负载的数据库,所以我不想获得任何锁或长时间运行的查询。

Aar*_*and 11

  1. 创建新表
  2. 删除旧表并在事务中重命名新表:

    BEGIN TRANSACTION;
      DROP TABLE dbo.OldTable;
      EXEC sys.sp_rename N'dbo.NewTable', N'OldTable', N'OBJECT';
    COMMIT TRANSACTION;
    
    Run Code Online (Sandbox Code Playgroud)

如果您担心掉落本身需要多长时间,您可以这样做:

BEGIN TRANSACTION;
  EXEC sys.sp_rename N'dbo.OldTable', N'garbage',  N'OBJECT';
  EXEC sys.sp_rename N'dbo.NewTable', N'OldTable', N'OBJECT';
COMMIT TRANSACTION;
DROP TABLE dbo.garbage;
Run Code Online (Sandbox Code Playgroud)

(从技术上讲,drop 不必成为交易的一部分,并且在任何情况下都不应该导致任何阻塞,所以现在 drop 实际需要多长时间在很大程度上无关紧要,因为它没有机会阻塞任何人。 )

如果您有索引、外键等,您还必须处理这些,但以上是您将获得的最快速度,因为它主要是元数据(最坏的情况是DROP将被现有活动阻止)。

如果您的情况更复杂,另请参阅 Schema Switch-A-Roo第 1部分第 2 部分