我有一个表TABLE_SRC,其中一个SQL Server DB中有300万条记录和20列 我想在不同的服务器和SQL Server DB中的相同结构表TABLE_DEST中加载数据 我刚刚创建了一个oledb源,它将从TABLE_SRC中提取数据,然后使用oledbcommand从TABLE_DEST中删除现有数据 然后使用oledbdestination将数据从TABLE_SRC映射并加载到TABLE_DEST。
但是这个过程花费了太多时间,因为数据量很大我明白这需要时间,但在这种情况下我可以优化或使用一些最佳实践来加载数据。
答案 0 :(得分:1)
不要使用OLE DB命令。它执行单例操作,这意味着您将在远程服务器上发出3M删除。相反,将控制流设计为Execute SQL Task
,后跟Data Flow Task
。在评论中,您已指出权限将成为一个问题,因为您无法发出truncate table命令。相反,执行SQL任务需要DELETE FROM dbo.MyTable;
来排空所有数据。
确保使用带有OLE DB目标的“快速加载”选项。这将锁定目标表以获得最佳负载模式。您可能希望尝试最大行提交大小(名称近似值)。默认值为20亿左右,尝试从50000开始。这比一次性提交的数据更小。这可以帮助目标服务器在将所有数据发送到其中时获得喘息空间。
会破坏你表现的其他因素:
除此之外,如果没有更多关于我可以给你的建议的详细信息,请快速完成。每小时3百万行不应该发送。
答案 1 :(得分:0)
oledb destination
下data 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
代替实际的删除操作。它会快得多。插入新数据仍取决于网络带宽和构建在表上的索引:您可以在插入/删除之前删除它们并在之后重新创建。