在表之间移动 100 万行的性能问题

sam*_*sam 2 sql-server-2008 sql-server partitioning

我想从重复1万行table1table2。我用这样的查询写了一份工作:

delete from table1 OUTPUT *.delete into table2
Run Code Online (Sandbox Code Playgroud)

我每小时都在执行这项工作,但需要很长时间。

另一个问题是我的日志文件大小不断增加。我怎样才能解决这个问题?

Jon*_*gel 7

这里有两个非常有效的解决方案,因为您只是在移动数据。这些是有效的,因为它们实际上根本不移动数据:它们只是操作元数据以将数据呈现在所需的位置。这意味着它们不仅会很快,而且所需的日志记录量也会很小。

  1. 如果您使用的是企业版,请利用表分区。如果表中只有一个分区,则该分区就是表。用于ALTER TABLE ... SWITCH将数据“移动”到table2.

  2. 重命名table1table2using sp_rename,然后table1使用SELECT TOP 0 * INTO语句或使用原始表定义重新创建。请注意,如果有任何约束/索引/等,您也需要重命名它们,以避免在再次创建新表时发生名称冲突。此方法适用于任何版本,因此我实际上可能会推荐它而不是其他解决方案,后者仅适用于 Enterprise。

请注意,执行其中任何一项都有一些限制——请参阅我链接到的文档。我不确定您是否使用标记了问题,因为表被复制(没有多大意义),或者因为您试图“复制”数据(也没有意义,因为你想要移动数据,而不是复制,这就是复制的含义)。