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

Posted

技术标签:

【中文标题】如何管理跨多个表的大型数据集? UNION 与大表?【英文标题】:How do I manage large data set spanning multiple tables? UNIONs vs. Big Tables? 【发布时间】:2013-05-22 15:13:35 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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'
)

【讨论】:

你不使用UNION。你会使用UNION ALL +1 您的第二个建议。它们都可以放在一个表中,每年都有单独的视图。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

。 . MS Access 是否支持水平分区? 绝对不是,但 OP 建议迁移到 SQL Server。【参考方案4】:

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

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

【讨论】:

以上是关于如何管理跨多个表的大型数据集? UNION 与大表?的主要内容,如果未能解决你的问题,请参考以下文章

GreenPlum 如何处理多个大型连接和同时工作负载?

在 Spark SQL 中将多个小表与大表连接的最佳方法

UNION ALL UNION

mysql把一个大表拆分多个表后,如何解决跨表查询效率问题

大型数据集跨因子的时间序列密度图

pig 倾斜连接与大表导致“拆分元数据大小超过 10000000”