1

为了增加报告的响应时间,我创建了一个汇总表,其作用类似于物化视图。我尚未确定刷新数据的频率,因为我仍在决定如何实际交换数据。

基于键更新数据不是当前结构的选项,因为每条记录都是从许多列的不同组合创建的,其中一些可以为空。当涉及空值时,这会导致更新匹配多行。数据库中的数据每天只更新一到两次,因此实际上没有必要非常频繁地更新它。

正如我目前设置的那样,我的存储过程只是截断汇总表中的数据,然后立即重新运行查询以从头开始重新填充它。由于我从数百万条记录中提取,这可能需要一些时间。是否有一种标准做法可以极快地替换大型数据集以最大程度地减少数据的停机时间?比如将新的汇总数据加载到临时表中,然后在查询完成后将其移动到汇总表中,也许?

4

1 回答 1

2

这是我用来解决此类问题的一些 DB 功夫:您使用一个简单的数据驱动开关在当前和下一个数据版本之间切换。

这里有一些 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 中的值以匹配您使用的新值。

这使您可以保留旧版本,在新版本损坏时切换回来,只要您需要计算新数据,就可以随时截断旧版本,并使版本之间的切换即时进行。这很简单,而且很有效。

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

于 2012-04-06T01:21:12.763 回答