微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个数据库,我将文件加载到一个临时表,从这个临时表我有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来帮助解决这个问题.那里可能有一些效率,但我不知道这些努力是否能够节省成本.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐