为了增加报告的响应时间,我创建了一个汇总表,其作用类似于物化视图。我还没有决定刷新数据的频率,因为我还在决定如何实际交换数据。
基于键更新数据不是当前结构的选项,因为每个记录都是从许多列的不同组合创建的,其中一些列可以为空。这会导致更新在涉及空值时匹配多行。数据每天只在数据库中更新一次或两次,因此无需经常更新数据。
正如我目前设置的那样,我的存储过程只是截断摘要表中的数据,然后立即重新运行查询以从头开始重新填充它。由于我从数百万条记录中抽出,这可能需要一些时间。是否有一种标准做法可以非常快速地替换大型数据集,从而最大限度地减少数据的停机时间?可能会在查询完成后将新的摘要数据加载到临时表中,然后将其移动到摘要表中,这可能是什么?
答案 0 :(得分:2)
这里有一些数据库功夫我已经习惯了解决这类问题:你使用一个简单的数据驱动开关在当前和下一版本的数据之间进行翻转。
这是一些用于演示此操作的SQL。
在某个地方创建一个表来容纳交换机(你可以在这里使用任何东西 - 如果你有设置表等):
create table data_switch(val int not null); // this will hold one row
接下来,将数据表更改为包含数据版本号的列:
alter table my_data add column data_version int;
最后,创建一个链接两者的视图,使data_version值驱动使用哪组数据:
create view current_data as
select * from my_data
where data_version = (select val from data_switch);
生成数据时,请为data_version指定一个新值。当您准备好使用它时,您只需更新data_switch中的值以匹配您使用的新值。
这允许您保留旧版本,如果新版本被破坏则切换回来,只要您需要计算新数据,在需要时截断旧版本,并在版本之间立即切换。这很简单,也很有效。
您可以准确地改变实现方式,但这是一般的想法。