2012-04-06 57 views
1

为了增加报告的响应时间,我创建了一个类似物化视图的汇总表。我还没有确定多久我会刷新数据,因为我仍然决定如何实际交换数据。快速刷新汇总数据以最大限度地减少停机时间

基于密钥更新数据不是当前结构的选项,因为每条记录都是由许多列的不同组合创建的,其中一些列可以为空。这会导致更新在涉及空值时匹配多行。数据仅在数据库中每天更新一次或两次,因此实际上不需要经常更新它。

正如我目前设置,我的存储过程只是截断汇总表中的数据,然后立即重新运行查询从头开始重新填充。由于我从数百万条记录中抽出,这可能需要一些时间。是否有一种标准的做法可以非常快速地替换大型数据集以最大限度地减少数据的停机时间?就像将新的汇总数据加载到临时表中,然后在查询结束后将其移动到汇总表中,可能是什么?

回答

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中的值以匹配您使用的新值。

这允许您保留旧版本,如果新版本损坏就切换回来,只要需要计算新数据即可,只要需要就截断旧版本,并且可以在各版本之间瞬时切换。这很简单,它的工作原理。

你可以改变你如何实现这个,但这是一般的想法。

+0

令人敬畏的技术。谢谢! – 2012-04-06 01:49:12

相关问题