如何管理跨多个表的大型数据集? 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 与大表?的主要内容,如果未能解决你的问题,请参考以下文章