【问题标题】:sql server to dump big table into other tablesql server 将大表转储到其他表
【发布时间】:2014-12-10 15:40:26
【问题描述】:

我目前正在将表的 Id 字段更改为 IDENTITY 字段。这很简单:创建一个临时表,将所有数据复制到临时表,调整从表到表的所有引用以指向和指向新临时表,删除旧表,重命名临时表原名。

现在我遇到了复制步骤耗时过长的问题。实际上,该表没有太多条目(约 750 万行),但仍需要几个小时才能完成。

我目前正在使用这样的查询移动数据:

设置 IDENTITY_INSERT MyTable_Temp 开启

INSERT INTO MyTable_Temp ([Fields]) 从 MyTable 中选择 [Fields]

SET IDENTITY_INSERT MyTable_Temp 关闭

我查看了 bcpcmdshell 和以下 BULK INSERT 的组合,但我不喜欢该解决方案首先将数据写入临时文件,然后将其转储回新表中。

有没有更有效的方法将数据从旧表复制或移动到新表?这可以在“纯”T-SQL 中完成吗?

请记住,数据是正确的(不涉及外部来源)并且在传输过程中不会对数据进行任何更改。

【问题讨论】:

  • 这个问题的第二个答案会帮助你:stackoverflow.com/questions/1049210/…
  • 在这种情况下,我看不到如何更改表以将其列更改为标识字段。对我来说,我的表的 Id 字段中的每个条目都是 NOT NULL 和 UNIQUE,但是像“ALTER TABLE MyTable ALTER COLUMN MyTableId INT IDENEITY NOT NULL”这样的内容不适用于错误“关键字'IDENTITY'附近的语法不正确”。 .答案没有指定 alter 语句的外观,我找不到这个问题的答案。我错过了什么吗?
  • 来自答案:诀窍是:您可以使用 SQL Server 的 ALTER TABLE...SWITCH 语句来更改表的架构而不更改数据,这意味着您可以将带有 IDENTITY 的表替换为相同的表模式,但没有 IDENTITY 列。同样的技巧可以将 IDENTITY 添加到现有列。
  • 在那种情况下,我们正在查看两个不同的答案(我的默认情况下按“活动”排序,而不是按投票排序)。在那种情况下,我会再看看。抱歉,感谢您指出我看不到的内容。这里直接链接到提到的答案:stackoverflow.com/a/1730868/1417088
  • @bruno 该方法是否使该列的外键保持工作?

标签: sql-server tsql


【解决方案1】:

您的方法看起来很公平,但是插入命令生成的事务太大,这就是为什么需要这么长时间。

我过去处理这个问题的方法是使用游标和批处理机制。

一次仅对 100000 行执行操作,您将看到重大改进。

复制完成后,您可以重建引用并最终删除旧表......等等。复制数据后,请注意相应地重新设置新表的种子。

【讨论】:

  • 您在谈论与此答案类似的内容:stackoverflow.com/a/9712157/1417088 ?
  • 是的,这与我所描述的类似,尽管您可以通过许多其他方式做到这一点。
猜你喜欢
  • 2012-04-09
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2016-08-11
  • 2014-06-10
相关资源
最近更新 更多