批量插入从桌到桌(Bulk Insert from table to table)

2019-09-18 06:11发布

我实现的A / B /查看场景中,这意味着该视图指向表A,表B中被更新,则发生一个开关和而表A被加载的观点表B。

开关每天发生。 还有数百万行的更新和成千上万的用户在看的视图。 我的SQL Server 2012上。

我的问题是:

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

Answer 1:

你可以到一个选择可乐,COLB到DestTable_New从srcTable要。 一旦DestTable_New被加载,重新创建索引和约束。

然后重命名DestTable到DestTable_Old和重命名DestTable_New到DestTable。 重命名为快速的极端。 如果事情原来是出了问题,你也有上表由(DestTable_Old)接近的备份。

我没有这种情况下,一旦我们不得不全天候运行的系统,每天要加载的数千万行的需要。



Answer 2:

你可以这样做

SELECT fieldnames
INTO DestinationTable
FROM SourceTable

作为一对夫妇的答案表明,这应该是尽可能快可以得到(取决于你需要多少索引重建等)。

不过,我会建议使用同义词 ,以指针从一个表切换到另一个。 他们是非常透明的,在我看来,不是更新视图,或重命名表的清洁剂。



Answer 3:

INSERT... SELECT...功能相当类似BULK INSERT 。 你可以使用SSIS,像@GarethD说,但如果你只是从表1至表2复制行,可能是过于复杂。

如果您要复制的数据量严重,保持对事务日志的眼睛 - 做巨大的刀片时,它可以臃肿起来非常快。 一个解决办法是,以“chunkify”您要插入的数据,通过遍历该过程,也就是说,只有10万或1000行的时间插入statment(取决于你行有多宽的,即每通多MB如何)。

(只是好奇,你在干什么ALTER VIEW重置有何看法?我没有类似的东西一次,虽然我们不得不四个表和四个视图,以支持过去/现在/未来/交换套。)



Answer 4:

我倾向于使用SSIS。

使表A中的OLEDB源和表B中的OLEDB目的地。 您将绕过事务日志,以便减少对数据库的负载。 唯一的方法(我能想到的)来做到这一点使用T-SQL是改变你的整个数据库,这是很不理想的恢复模式,因为它意味着没有交易被存储,而不是只为你传递的人。

设置SSIS转移

创建一个新的项目,并将一个数据流任务,您的设计图面

你的数据流任务双击将带您通过对数据流标签。 然后将来自“数据流源”菜单中删除一个OLE DB源,并从“数据流目标”的OLE DB目的地菜单

双击OLE DB源,建立与服务器的连接,选择你想从装载表,然后单击确定。 从OLE DB源到目的地拖动绿色箭头,然后双击目标。 设置您的连接管理器,目标表名和列映射,你应该是好去。

MSDN上OLE DB源文档

MSDN上OLE DB目标文档



Answer 5:

你可以简单地做这样的

    select * into A from B Where [criteria]

这应选择B中的数据,根据该标准,并应其插入,所提供的列是相同的,也可以指定,而不是列名*。



Answer 6:

我知道这个问题是旧的,但我是打猎的答案,同样的问题,并没有发现什么真正的帮助。 是的SSIS方法是可能的,但问题想要一个存储过程。

让我高兴的,我已经发现(几乎)是原来的问题解决通缉; 您可以使用CLR SP做到这一点。

选择从表A的数据转换成一个DataTable,然后使用SqlBulkCopy类的在WriteToServer(数据表DT)方法作为表B的DestinationTableName。

唯一的小缺点是CLR过程必须使用外部访问,以便使用SqlBulkCopy的,并且不与上下文的连接工作,所以你需要摆弄一点点的权限和连接字符串。 但是,嘿! 没有什么是完美的。



文章来源: Bulk Insert from table to table