【发布时间】:2014-07-10 11:19:34
【问题描述】:
我知道我可以通过编写简单的连接来轻松连接 2-3 个小表。然而,当你有 7-8 个表,超过 2000 万行,加入 1-3 列时,这些连接可能会变得非常慢, 即使你有正确的索引。而且,查询也变得又长又丑。
是否有替代策略来进行如此大的连接,最好是与数据库无关的?
编辑
这是连接的伪代码。请注意,在连接中使用某些表之前可能必须先取消透视表 -
select * from
(select c1,c2,c3... From t1 where) as s1
inner join
(select c1,... From t2 where) as s2
inner join
(unpivot table to get c1,c2... From t3 where) as s3
inner join
(select c1,c2,c3... From t2 where) as s4
on
(s1.c1 = s2.c1)
and
(s1.c1 = s3.c1 and s1.c2 = s3.c2)
and
(s1.c1 = s4.c1 and s2.c2 = s4.c2 and s1.c3 = s4.c3)
显然,这既复杂又丑陋。有没有办法在不使用如此复杂的连接的情况下以更简洁的方式获得相同的结果集?
【问题讨论】:
-
您可以发布查询吗?
-
您的意思是除了重新设计数据库以不必进行那种类型的连接之外?还是购买合适的大型数据库服务器?
-
我不认为有一个通用的答案。在我看来,您希望对 OLTP 数据库执行 DSS 查询并期望获得不错的性能。这可能是可能的,但它肯定需要经验和专业知识,而这些经验和专业知识并不总是可以在不同的 RDMS 之间转移。理想情况下,您在 OLTP 数据库之上构建 OLAP 多维数据集并查询它们。如果这不是一个选项,我会考虑(在 Oracle 的情况下)表/索引分区、物化视图、并行查询执行、稳定执行计划等。据我所知,SQLServer 和 Postgress 也支持类似的技术。
-
@a1ex07 - 感谢亚历克斯的回复。实际上,我想从一个巨大的查询中提取结果并将其保存为不同的文件格式。现在我添加了一些代码来演示我的问题,请重新考虑打开我的问题。如果需要更多信息,请告诉我。
-
有没有办法在不使用如此复杂的连接的情况下以更简洁的方式获得相同的结果集? 如果数据库正确规范化,那么您创建一个非规范化视图并查询它。但是您必须使用复杂的连接来创建它。所以是和不是。
标签: mysql sql sql-server oracle postgresql