这与SQL Server 2008 R2和SSIS有关。
我需要使用另一台服务器上的生产表中的新数据更新一台服务器上的数十个历史表。
这两台服务器没有链接,也没有链接。
有些历史表有100万行,有些生产表有数十万行。
我目前为每个使用以下数据流组件的表都有一个流程:
对于大型表来说,这个过程太慢了。一定有更好的方法。有人可以帮忙吗?
我知道如果服务器是链接的,基于单个集的查询可以轻松有效地完成任务,但服务器没有链接。
答案 0 :(得分:1)
将您的问题细分为较小的问题。这是你要解决这个问题的唯一方法。
让我们来看看问题。
您正在插入和/或更新现有数据。在数据库级别,行被打包到页面中。它很少是完全合适的,并且页面中通常还有一些可用空间。当您更新一行时,假装名称字段从“bob”变为“Robert Michael Stuckenschneider III”。这一行需要更多的居住空间,而页面上还剩下一些空间,但这还不够。其他行可能会被拖拽到下一页只是为了给这个人一些肘部空间。这将导致大量的磁盘活动。是的,鉴于您要添加更多数据,这是不可避免的,但了解 数据将如何增长并确保数据库本身已为此增长做好准备非常重要。也许,您在目标表上有一些非聚集索引。禁用/删除它们应该可以提高插入/更新性能。如果您仍然将数据库和日志设置为以10%或1MB或者默认值增长,则存储引擎将花费所有时间来尝试增长文件,并且没有时间实际写入数据。带走:确保您的系统准备好接收大量数据。与您的DBA,LAN和SAN团队合作
您的OLTP系统中有数千万行,归档系统中有数亿行。从OLTP数据开始,您需要确定历史系统中不存在的内容。鉴于您的数据量,我会计划这个程序包在处理过程中遇到麻烦,需要“重新启动”。我将拥有一个包含数据流的包,其中只有从OLTP中选择的用于与目标表进行匹配的业务键。将这些密钥写入OLTP服务器(ToBeTransfered)上的表中。有第二个包使用这些键的子集(N行)连接回原始表作为源。它直接连接到Destination,因此无需查找。该胖数据行仅在网络上流动一次。然后执行一个执行SQL任务并删除刚刚发送到存档服务器的批处理。此批处理方法可以允许您在多个服务器上运行第二个程序包。 SSIS团队在他们的论文中更好地描述了它:We loaded 1TB in 30 minutes
确保查找是对SELECT key1, key2 FROM MyTable
格式的查询更好的是,您能为查找提供过滤器吗? WHERE ProcessingYear = 2013
因为如果OLTP仅包含2013年数据,则无需在2012年浪费缓存。
您可能需要修改Connection Manager上的PacketSize并让网络人员设置Jumbo帧。
查看您的查询。你有好的计划吗?您的表格是否已过度索引?请记住,每个索引都会导致执行的写入次数增加。如果您可以在处理完成后转储它们并重新创建,您会认为您的SAN管理员为您购买了一些FusionIO驱动器。我知道当我从十亿行表中删除了14个NC索引时,我只做了10列。
如果你仍然遇到性能问题,建立一个理论基线(在现实世界中永远不会发生的理想条件下,我可以在N个单位时间内从A到B推送1GB)并从那里开始工作你的实际是什么。您必须具有限制因素(IO,CPU,内存或网络)。找到罪魁祸首并投入更多资金或重组解决方案,直到它不再是滞后指标。
答案 1 :(得分:0)
步骤1.将适当的自豪数据增量批量导入到新服务器。 参考:将数据从单个客户端(或流)导入非空表 http://msdn.microsoft.com/en-us/library/ms177445(v=sql.105).aspx
步骤2.使用合并声明识别新的/现有记录并对其进行操作。
我意识到新服务器上需要占用大量磁盘空间,但过程运行速度会更快。