1

我有一个跨越多年的聚合数据集。每一年的数据都存储在一个名为 Data 的单独表中。数据当前位于 MS ACCESS 表中,我将把它迁移到 SQL Server。

我希望每年的数据都保存在单独的表中,以便在运行时合并和查询。但是,我不想以牺牲效率为代价来做到这一点,因为每年大约是。40ish 字段的 150 万条记录。

我试图避免在查询中执行过多的 UNIONS。我还想避免在添加每个新年时编辑查询,从而导致 UNION 数量不断增加。

有没有一种简单的方法可以在运行时执行这些 UNION,而不需要大量的 SQL 查询和高系统实用程序?或者,如果所有数据都应该在一个大表中进行管理,是否有一种快速简便的方法可以将所有表附加到一个查询中?

4

4 回答 4

4

如果您真的想将它们存储在单独的表中,那么我会创建一个为您执行联合的视图。

create view AllData
as
(
    select * from Data2001
    union all
    select * from Data2002
    union all
    select * from Data2003
)

但老实说,如果你用这个,为什么不把所有的数据都放在一张表中。然后,如果您愿意,可以以另一种方式创建视图。

create view Data2001
as
(
    select * from AllData
            where CreateDate >= '1/1/2001'
            and CreateDate < '1/1/2002'
)
于 2013-05-22T15:19:07.437 回答
0

由于代表率低,我无法添加评论,但绝对同意 1 个表,并且分区对于大型数据集很有帮助,并且在数据将迁移到的 SQL Server 中得到支持。

如果数据被大量使用并且经常更新,那么每月分区可能会很有用,但如果不是,考虑到数据大小,分区可能不会很有帮助。

于 2013-05-22T17:01:09.923 回答
0

单个表可能是此类查询的最佳选择。但是,您必须平衡数据库正在做的其他工作。

您没有提到的一个选择是创建一个包含联合的视图,然后在该视图上进行查询。这样至少您每年只需将联合语句添加到视图中,并且使用该视图的所有查询都是正确的。就个人而言,如果我这样做了,我会编写一个创建查询来创建表,然后调整视图以添加该表的联合。一旦它经过测试并且我知道它会运行,我会将它安排为在一年的最后一天运行的作业。

于 2013-05-22T15:20:26.063 回答
0

一种方法是使用水平分区。

您基本上创建了一个分区函数,通知 DBMS 为每个时期创建单独的表,每个表都有一个约束,通知 DBMS 每个中只有特定年份的数据。

在查询执行时,优化器可以决定是否可以完全忽略一个或多个分区以加快执行时间。

这种模式的设置开销并不小,只有当您有大量数据时才真正有意义。尽管每年 150 万行可能看起来很多,但根据您的查询计划,这应该没什么大不了的(对于配置得当的 SQL 服务器)。参考文档

于 2013-05-22T15:31:37.900 回答