如何在数据庞大时优化ssis包

时间:2018-02-22 08:18:35

标签: sql sql-server ssis ssis-2012

我有一个表TABLE_SRC,其中一个SQL Server DB中有300万条记录和20列  我想在不同的服务器和SQL Server DB中的相同结构表TABLE_DEST中加载数据  我刚刚创建了一个oledb源,它将从TABLE_SRC中提取数据,然后使用oledbcommand从TABLE_DEST中删除现有数据  然后使用oledbdestination将数据从TABLE_SRC映射并加载到TABLE_DEST。

但是这个过程花费了太多时间,因为数据量很大我明白这需要时间,但在这种情况下我可以优化或使用一些最佳实践来加载数据。

4 个答案:

答案 0 :(得分:1)

  1. 不要使用OLE DB命令。它执行单例操作,这意味着您将在远程服务器上发出3M删除。相反,将控制流设计为Execute SQL Task,后跟Data Flow Task。在评论中,您已指出权限将成为一个问题,因为您无法发出truncate table命令。相反,执行SQL任务需要DELETE FROM dbo.MyTable;来排空所有数据。

  2. 确保使用带有OLE DB目标的“快速加载”选项。这将锁定目标表以获得最佳负载模式。您可能希望尝试最大行提交大小(名称近似值)。默认值为20亿左右,尝试从50000开始。这比一次性提交的数据更小。这可以帮助目标服务器在将所有数据发送到其中时获得喘息空间。

  3. 会破坏你表现的其他因素:

    • 网络不好
    • 数据流中的其他转换(我假设OLE DB源到OLE DB目的地)
    • 在Visual Studio中运行包
    • 以32位模式运行程序包
    • 目标服务器调整不佳
    • 不处理数据流任务中的LOB数据类型(image / object /(n)text /(n)varchar(max)/ varbinary(max))

    除此之外,如果没有更多关于我可以给你的建议的详细信息,请快速完成。每小时3百万行不应该发送。

答案 1 :(得分:0)

oledb destinationdata access mode下的fast load尝试使用table or view fast load选项(在您的情况下为const start = /[/]/g; "/dev/null".match(start) // => ["/", "/"] const word = /[/](\w+)/ig; "/dev/null".match(word) // => ["/dev", "/null"]

答案 2 :(得分:0)

不删除和插入日期。使用带有SSIS包的SQL更改跟踪来插入增量数据。

答案 3 :(得分:-1)

一个好的做法是:不要删除任何数据。如果金额巨大且您必须删除某些内容,请仅在成功转换并验证传输数据的正确性后再执行此操作。

使用soft delete代替实际的删除操作。它会快得多。插入新数据仍取决于网络带宽和构建在表上的索引:您可以在插入/删除之前删除它们并在之后重新创建。