加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 海宁网 (https://www.hainingwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 插入大量行的最快方法是什么?

发布时间:2021-01-08 03:20:05 所属栏目:编程 来源:网络整理
导读:我有一个数据库,我将文件加载到一个临时表,从这个临时表我有1-2个连接来解析一些外键,然后将这些行插入到最终表(每月有一个分区).我有大约34亿行三个月的数据. 从登台到最终表格的最快方法是什么? SSIS数据流任务(使用视图作为源并具有快速加载活动)或插入IN

我有一个数据库,我将文件加载到一个临时表,从这个临时表我有1-2个连接来解析一些外键,然后将这些行插入到最终表(每月有一个分区).我有大约34亿行三个月的数据.

从登台到最终表格的最快方法是什么? SSIS数据流任务(使用视图作为源并具有快速加载活动)或插入INTO SELECT ….命令?我尝试了数据流任务,并且可以在大约5小时内获得大约10亿行(服务器上的8核/ 192 GB RAM),这对我来说感觉非常慢.

解决方法

一种常见方法:

>禁用/删除目标表上的索引/约束.
> INSERT dbo.[Target] WITH(TABLOCKX)SELECT …
>当然,有了JNK的功劳,您可以批量生成上述n行,这可以减少事务日志的压力,当然也就是说如果某个批次失败,您只需要从该批次开始.我在这里写博客(虽然在引用删除时,同样的基本概念适用):http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes
>重新启用/重新创建目标表上的索引/约束(如果它们不是所有操作都必需的话,您可以推迟其中的一些,并且更快地使基础数据联机更为重要).

如果您的分区是物理的而不仅仅是逻辑分区,则可以通过让不同的进程同时填充不同的分区来获得一些时间(当然这意味着您不能使用TABLOCK / TABLOCKX).这假设源也适用于多个进程选择而不重叠/锁定等,并使操作的那一侧更慢(提示:在源上创建适合目标分区方案的聚簇索引).

你也可以考虑一些更原始的东西,比如BCP OUT / BCP IN.

我不知道我会跳到SSIS来帮助解决这个问题.那里可能有一些效率,但我不知道这些努力是否能够节省成本.

(编辑:财气旺网 - 海宁网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!