【问题标题】:prod oracle table continues readprod oracle 表继续阅读
【发布时间】:2021-08-19 12:30:26
【问题描述】:

在一种情况下寻求帮助。 我有一个经常读取元数据表的 OLTP 应用程序(app1),该表只有 2k 条记录。 另一个应用程序(app2)需要在一天内刷新(删除并再次插入 2k 条记录)元数据表几次。

既然没有停机时间,我该如何刷新元数据表?

我能想到的一个选项是:

  1. 将“ACTIVE”列添加到元数据表(初始加载将 1 设为 Active)
  2. app1 在阅读时始终使用 Active=1
  3. app2:第一次使用 Active=0 插入新元数据
  4. app2:第二次删除活动=1
  5. app2:第三次更新所有行 Active=1
  6. app2:最终提交

我不太相信上面的选项,还有其他选择吗?

【问题讨论】:

  • 什么是app3?如果只有一个应用程序更新,只要它在单个事务中完成所有更新,您实际上就没有问题,特别是因为表很小。
  • 为什么不使用触发器来更新表?这将比您使用的方式更实时。
  • 一种解决方案是在一个临时表中加载新数据,一旦准备好,交换两个表。您可以使用 RENAME 语句或使用 SYNONYMS 来做到这一点。就速度而言,这是最高效的方法,但仅在某些条件下有效(特别是同一技术用户,没有外键违规)。这对于数据仓库或报告数据库是理想的,在密集的操作数据库中较少。见thisthat 的想法
  • @Mat,app3 是拼写错误,它实际上是一个 app2。是的,只有 app2 会在单个事务中更新此表。我担心一天内对这张表应用几次删除。

标签: sql oracle11g oracle12c


【解决方案1】:

需要停机的问题是什么?您不需要在这里做任何特别的事情,除非您有 2,000 行数据,但每行的大小为数百 MB,或者您在 App1 中有一些运行几个小时的查询(这在 OLTP 应用程序中似乎不太可能) .

只要您将deleteinsert 作为单个事务的一部分(您所说的那样),您应该不会对App1 造成任何问题。在刷新提交之前运行的任何查询 App1 都将看到刷新之前的数据状态。刷新提交后 App1 运行的任何查询都将看到刷新后数据的状态。读取器从不阻塞写入器,写入器从不阻塞 Oracle 中的读取器,因此 App1 不会关心 App2 是否处于刷新中间(好吧,如果它需要使用数据,它可能需要做更多的工作来读取数据在undo 段中重建数据的读取一致视图,但不太可能对性能产生有意义的影响)。

【讨论】:

  • 感谢贾斯汀·凯夫(Justin Cave),我想在桌子上删除太多次,但由于桌子太小(最多 2k 条非常小的记录),我相信我们应该没问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多