如何管理跨越多个表的大型数据集? UNIONs与大表?

时间:2013-05-22 15:13:36

标签: sql sql-server ms-access

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

我希望每年的数据保存在单独的表中,以便在运行时进行合并和查询。我不想以牺牲效率为代价来做这件事,因为每年约为。 40个字段的1.5M记录。

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

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

4 个答案:

答案 0 :(得分:4)

如果你真的想将它们存储在不同的表中,那么我会创建一个为你做联合的视图。

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

但说实话,如果你使用它,为什么不将所有数据放入1个表中。然后,如果你想要,你可以用另一种方式创建视图。

create view Data2001
as
(
    select * from AllData
            where CreateDate >= '1/1/2001'
            and CreateDate < '1/1/2002'
)

答案 1 :(得分:0)

单个表可能是此类查询的最佳选择。不管怎样,你必须平衡这一点,以获得数据库所做的其他工作。

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

答案 2 :(得分:0)

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

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

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

这种模式的设置开销非常重要,只有拥有 lot 数据才真正有意义。虽然每年150万行可能看起来很多,但根据您的查询计划,它应该没什么大不了的(对于一个体面的SQL服务器)。请参阅documentation

答案 3 :(得分:0)

由于低代表我无法添加注释,但肯定同意1个表,分区对大型数据集很有用,并且在SQL Server中受支持,数据将被迁移到。

如果数据被大量使用并经常更新,那么每月分区可能会有用,但如果没有,给定大小,分区可能不会非常有用。