加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL数据库中定期同步数据的最有效方法是什么?

发布时间:2020-12-13 15:52:22 所属栏目:百科 来源:网络整理
导读:我的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 "up
我的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分钟运行一次并执行以下操作:

>查询来自SOAP Web服务的所有项目记录(此上下文中的“项目”仅包含名称(字符串)和几个布尔和整数字段).
>将数据库中的项目列表与SOAP结果同步,丢弃SOAP结果中不再存在的任何记录,并添加找到的任何新记录.

这种定期同步的最有效方法是什么?重要的是,DB中的行与SOAP结果中给出的记录完全匹配,没有额外的内容.

我可以想到两个解决方案,但不确定哪个是最快的(因为有成千上万的记录而且我想尽可能频繁地同步,所以性能是一个问题):

>在每次同步期间,删除cached_projects中的所有行,并为通过SOAP服务找到的每个项目插入一个新行.

这将实现具有完全相同的数据集的目标,但是每次在DB中删除~50,000行是多么昂贵,假设其中绝大多数将保持不变?在DB中有这么多“流失”有缺点吗?
>在每次同步期间,选择cached_projects中的所有行,将它们存储在临时Hash变量中.循环遍历SOAP记录,并检查每个记录是否已存在于DB中(使用临时哈希),保留我们找到的DB记录的ID列表,以便它们可以保留在DB中.比较所有内容后,为任何新记录插入行,并为不再在表中的记录删除行.

这是我目前的解决方案,虽然它也完全反映了数据,但比较Rake任务中的所有记录都是计算密集型的,每次同步大约需要3-5分钟. (实际上,第一次同步,当DB表为空时,它更快但在后续同步时它必须与所有行进行比较,这样会慢一些.)

我愿意接受其他建议或改进这些想法.到目前为止,我一直在寻找我的应用程序代码中的解决方案(基于Ruby的rake任务),但我也对将更多逻辑推入数据库本身的想法感兴趣,因为我对这方面的熟悉程度要低得多东西的.

解决方法

如果您的第一次同步比后续同步更快,这意味着将所有数据插入数据库比比较每个数据更快并修改现有表.

我建议你使用TRUNCATE删除表中的所有记录而不是删除,然后将所有记录插入表中.

http://en.wikipedia.org/wiki/Truncate_(SQL)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读