问题描述
|
我有一个数据库表,它会定期完全重新填充新数据。然后需要将此数据推入相应的实时数据库表中,以覆盖先前的实时数据。
随着表大小的增加,将数据推送到活动表所需的时间也增加了,该应用看起来像丢失了数据。
一种解决方案是将新数据推送到live_temp表中,然后在该表上运行sql RENAME命令以将其重命名为活动表。重命名通常在不到一秒的时间内运行。这是解决此问题的“正确”方法吗?
还有其他解决此问题的策略或工具吗?谢谢。
解决方法
我不喜欢以这种方式弄乱架构对象-它会使查询优化器混乱,而且我不知道在执行重命名时正在进行的任何事务将发生什么。
我更喜欢在表中添加一个version列,并有一个单独的表来保存当前版本。
这样,客户端代码变为
select *
from myTable t,myTable_currentVersion tcv
where t.versionID = tcv.CurrentVersion
这也保留了历史记录-可能有用或无效如果在设置CurrentVersion列后没有删除旧记录。
, 创建一个重复表-精确副本。
创建一个新表,该表除了跟踪\“最新\\”表外无所不包。
最新(表格)
id(列)-保存包含“最新”数据的表的名称。
重新填充时,填充旧表并更新MostCurrent.id以反映该表。
现在,在将数据绑定到页面的应用程序中,绑定最新的表。
, 仅将更改推送到实时数据库表是否合适?对于大多数应用程序,我所做的更改很少。您应该能够在单个事务中应用所有更改。提交交易将使它们可见,并且桌上没有中断。
如果数据确实发生了完全更改,则可以配置数据库,以便可以在单个事务中替换所有数据。