我的PostgreSQL 9.0.x数据库中有一个名为cached_projects
的表,我主要通过Rails应用程序访问,其架构如下所示:
create_table "cached_projects", :force => true do |t|
t.string "name", :null => false
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.boolean "localization", :default => false, :null => false
t.integer "base_project_id"
end
该表由一个Rake任务填充,该任务每 N 分钟运行一次并执行以下操作:
执行此定期同步的最有效方法是什么?重要的是,DB中的行与SOAP结果中给出的记录完全匹配,没有额外的内容。
我可以想到两种解决方案,但不确定哪种解决方案最快(由于存在数万条记录并且我希望尽可能频繁地同步,因此性能是一个问题):
在每次同步期间,删除cached_projects
中的所有行,并为通过SOAP服务找到的每个项目插入一个新行。
这将实现拥有完全相同的数据集的目标,但是每次在DB中删除~50,000行是多么昂贵,假设绝大多数都不会改变?在DB中有这么多的“流失”是不是有缺点?
在每次同步期间,选择cached_projects
中的所有行,将它们存储在临时Hash变量中。循环遍历SOAP记录,并检查每个记录是否已存在于DB中(使用临时哈希),保留我们找到的DB记录的ID列表,以便它们可以保留在DB中。在比较所有内容之后,为任何新记录插入行,并为不应再在表中的记录删除行。
这是我目前的解决方案,虽然它也完全反映了数据,但比较Rake任务中的所有记录都是计算密集型的,每次同步大约需要3-5分钟。 (实际上,第一次同步,当数据库表为空时,它更快,但在后续同步时,它必须与所有行进行比较,这样会更慢。)
我愿意接受其他建议或改进这些想法。到目前为止,我一直在寻找我的应用程序代码中的解决方案(基于Ruby的rake任务),但我也对将更多逻辑推入数据库本身的想法感兴趣,因为我对这方面的熟悉程度要低得多事情。
答案 0 :(得分:1)
如果您的第一次同步比后续同步更快,这意味着将所有数据插入数据库比比较每个数据更快并修改现有表。
我建议您使用TRUNCATE
删除表中的所有记录而不是删除,然后将所有记录插入表中。