noj*_*lag 29 performance sql-server insert sql-server-2012 query-performance
我有一个数据库,我将文件加载到临时表中,从这个临时表我有 1-2 个连接来解析一些外键,然后将这些行插入到最终表中(每个月有一个分区)。我有大约 34 亿行数据,用于三个月的数据。
将这些行暂存到最终表中的最快方法是什么?SSIS 数据流任务(使用视图作为源并具有快速加载活动)或插入 INTO SELECT .... 命令?我尝试了数据流任务,可以在大约 5 小时内获得大约 10 亿行(服务器上有 8 个内核/192 GB RAM),这对我来说感觉很慢。
Aar*_*and 26
一种常见的做法:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...n,这可以减少事务日志的压力,当然也意味着如果某个批次失败,您只需从该批次开始。我在博客上写了这个(在提到删除时,同样的基本概念适用):http : //www.sqlperformance.com/2013/03/io-subsystem/chunk-deletes 如果您的分区是物理分区而不仅仅是逻辑分区,您可以通过让不同的进程同时填充不同的分区来获得一些时间(当然这意味着您不能使用TABLOCK/ TABLOCKX)。这假设源也适用于多个进程选择而不重叠/锁定等,并使操作的那一侧更慢(提示:在源上创建适合目标分区方案的聚簇索引)。
你也可以考虑更原始的东西,比如BCP OUT/BCP IN。
我不知道我会跳到 SSIS 来帮助解决这个问题。那里可能有一些效率,但我不知道这种努力是否值得节省。
Zan*_*ane 11
从 SSIS 的角度来看您的问题,我觉得这可能需要这么长时间的原因是您没有进行批处理。这可能会导致过多的行填充 SSIS 管道,并因此会影响您的 SSIS 性能。您需要做的是更改每个批处理设置的行以及可能的最大插入提交大小。现在您设置的内容也将取决于您的 SSIS 服务器可用的内存量?您的 SQL Server 实例的磁盘速度是多少?最好的方法是测试。例如,让我们使用 10,000。这将一次向服务器发送 10,000 个批次,从而防止您的管道过度填充,并有助于更快地运行此过程。这些设置在您的 OLEDB 目标中设置。

如果这是一个问题,您还可以按照@AaronBertrand 的建议在前后添加执行 SQL 任务,并删除/重新向表中添加任何索引或约束。
| 归档时间: |
|
| 查看次数: |
118341 次 |
| 最近记录: |