我有一个远程Postgresql数据库,其中包含一个表(我无法更改),其中包含信息(只有几列而不是整个表)我想用一个表同步到本地SQL Server 2008 Express数据库(我可以改变。。
现在我正在寻找一种有效的方法来做到这一点。由于同步将每隔约5分钟运行一次,每次重新加载整个表会产生很多不必要的流量,我试图避免。
我考虑过保存最新的ID,并且只是抓住一些较新的ID,但有可能(不太可能但仍然可能)旧数据被更改。就这样,我会错过改变的数据。
同步将由与本地SQL Server在同一台计算机上运行的C#程序完成。
答案 0 :(得分:2)
这个问题有两个解决方案。您可以尝试变聪明并仅传输更改 - 但需要在源数据库上进行某些集成;我确信您的数据库管理员可以帮助您 - 可能触发跟踪所有触摸的行(例如使用源表的主键)。这个解决方案可以很好地扩展,但它更复杂。我认为你应该看第二个选择:简单的暴力。
通过它的声音,你的整个桌子舒适地适合100MB。这只是数据不多。假设您可以获得10MB / s的传输速率(根本不是非常古怪),您可以在10秒内传输所有内容。如果,如您所说,您只需要几列,则总数据传输可能会少得多。每五分钟使用10秒的数字,这将是3%负载的顺序,以保持数据最新 - 这对源数据库来说是一个简单的查询,可能不会导致太多负载,特别是因为它' ll都被缓存在内存中,因为数据集太小了。
看看SqlBulkCopy
。本文(Transderring data using SqlBulkCopy
)是使用它将数据从一个数据库复制到下一个数据库的示例。源数据阅读器可以是任何东西;我使用它来插入来自对象的计算数据,但是一个特别简单的情况是DbDataReader,你可以从Postgresql中获取select语句。
不幸的是,默认选项并不太好,所以您可能希望指定SqlBulkCopyOptions
对您有用。 TableLock可能不错。此外,如果您并行执行此操作(即将多个批量插入到一个表中),请注意索引(可能导致死锁)。如果您使用批量复制批量大小,您可以优化吞吐量和内存使用之间的权衡,但默认情况下可以正常工作。
从概念上讲,我会这样做:
using
)SqlTransaction
这样,您将以原子方式更新目标表。
我不确定你要做什么,但如果这是某种形式的缓存,请考虑完全取消目标SQL服务器并将数据作为对象数组保留在内存中。对只读数据的内存访问速度非常快,数据集很容易适合内存。