从表到表的批量插入

时间:2012-06-19 12:08:42

标签: sql sql-server insert bulkinsert

我正在实施 A / B / View 方案,这意味着查看指向表A ,而表B 更新,然后发生切换,并且在加载表A时视图指向表B.

每天都会进行切换。有数百万行要更新,数千名用户正在查看该视图。我在SQL Server 2012上。

我的问题是:

  • 如何以最快的方式将数据从另一个表插入表中? (在存储过程中)
  • 有没有办法使用BULK INSERT?或者,使用常规插入/选择最快的方式去?

6 个答案:

答案 0 :(得分:3)

你可以做

SELECT fieldnames
INTO DestinationTable
FROM SourceTable

正如一对答案建议的那样,它应该尽可能快(取决于你需要重建的索引数量等)。

但我建议使用 synonyms 来将指针从一个表更改为另一个表。它们非常透明,在我看来,比更新视图或重命名表更清晰。

答案 1 :(得分:2)

您可以从SrcTable选择ColA,ColB到DestTable_New。加载DestTable_New后,重新创建索引和约束。

然后将DestTable重命名为DestTable_Old并将DestTable_New重命名为DestTable。重命名非常快。如果出现问题,您还可以通过(DestTable_Old)备份上一个表。

我曾经做过这种情况,我们必须让系统全天候运行并且每天需要加载数千万行。

答案 2 :(得分:1)

我倾向于使用SSIS。

使表A成为OLEDB源,表B成为OLEDB目标。您将绕过事务日志,以减少数据库的负载。使用T-SQL执行此操作的唯一方法(我能想到)是更改整个数据库的恢复模型,这远非理想,因为这意味着不存储任何事务,而不仅仅是传输事务。

设置SSIS转移

创建一个新项目并将数据流任务拖到设计图面

Tool box menu

双击数据流任务,该任务将引导您进入“数据流”选项卡。然后从“数据流源”菜单中拖放OLE DB源,从“数据流目标”菜单中拖放OLE DB目标

Data flow sources Data flow destinations

双击OLE DB源,设置与服务器的连接,选择要加载的表,然后单击“确定”。将绿色箭头从OLE DB源拖动到目标,然后双击目标。设置连接管理器,目标表名称和列映射,你应该很高兴。

<强> OLE DB Source docs on MSDN

<强> OLE DB Destination docs on MSDN

答案 3 :(得分:1)

INSERT... SELECT...功能与BULK INSERT非常相似。您可以使用SSIS,就像@GarethD所说的那样,但如果您只是将行从table1复制到table2,那可能会过于复杂。

如果您要复制大量数据,请密切关注事务日志 - 在执行大量插入时,它会非常快速地膨胀。一种解决方法是通过循环一个插入语句来“插入”您正在插入的数据,例如,每次只处理100,000或10,000行(取决于行的宽度,即每遍的MB数)。

(只是好奇,你正在做ALTER VIEW来重置视图吗?我做了类似的事情,虽然我们必须有四个表和四个视图来支持过去/现在/下一个/交换集。)

答案 4 :(得分:0)

你可以这样做

    select * into A from B Where [criteria]

这将根据标准从B中选择数据并将其插入A中,前提是列相同或者您可以指定列名而不是*。

答案 5 :(得分:0)

我知道问题已经过时了,但我正在寻找同一个问题的答案,并没有找到任何真正有用的东西。是的SSIS方法是可能的,但问题需要存储过程。

令我高兴的是,我发现了(几乎)原始问题所需的解决方案;你可以用CLR SP做到这一点。

从TableA中选择数据到DataTable中,然后使用SqlBulkCopy类的WriteToServer(DataTable dt)方法,将TableB作为DestinationTableName。

唯一的缺点是CLR过程必须使用外部访问才能使用SqlBulkCopy,并且不能与上下文连接一起使用,因此您需要对权限和连接字符串进行一些操作。但是嘿!没有什么是完美的。