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