跨数据库联合查询

3

我的仓库数据集分布在同一服务器的3个数据库中。这是一个概念验证项目,其中有三个数据提取,它们被加载到各自的数据库中。

当我将其提取到一个立方体中时,我基本上是这样做的:

SELECT * FROM DB1.dbo.Fact_Pres
UNION
SELECT * FROM DB2.dbo.Fact_Pres
UNION
SELECT * FROM DB3.dbo.Fact_Pres

我应该将数据实际合并到一个表中吗?这样做会使我的处理速度更快吗?

我没有磁盘空间的问题 - 我想实现最佳解决方案。

无论哪种情况,您能帮助我理解为什么您建议的方法是最优的吗?


+1 有趣。让我们看看会得到什么回答。 - Saar
3
为什么你们的仓库分成了三个数据库? - Tomalak
4个回答

3

是的,你绝对应该这样做。在不同的数据库中拆分相同的表没有任何意义。如果你遇到硬盘空间问题,请考虑对表进行分区。

关于你的评论:

性能成本并不是非常大,但联合操作会执行合并连接,这会带来一些开销。

此外,你确定你正在正确使用UNION吗?UNION将消除重复的值。也许你真正想做的是UNION ALL?


你能帮我理解为什么从一个表中处理会比联合三个表的处理更快吗? - Raj More
UNION ALL 确实是我想要的。谢谢! - Raj More

3
考虑使用SQL Server的一流分区来联合表格(而不是自己做)。如果您总是选择每个数据点,那么可能是的,从多个磁盘中提取数据更快。
但是为什么要使用多个数据库呢?您可以将三个表格堆叠到一个表格中,但是该表格必须在三个驱动器RAID组合上实现。如果您想要速度,这是一个更明确的解决方案。
联合只有在选择集的特定相邻部分时才有意义。但根据您的OP,您选择了所有内容,因此消除了该优势。

我正在我的数据立方体中进行分区,以便报告可以从中运行。 - Raj More
如果你正在进行报告,为什么要提到你将表联合在一起?你何时会查询每个数据点? - Mark Canlas
我从SQL Server的事实表中查询所有内容,我的SSAS立方体包含了报告所需的所有聚合。不过,我可能没有理解你的问题重点,请详细说明。 - Raj More

2
跨数据库查询比数据库内查询(略微)慢一些。如果您需要三个独立的表,则建议在同一个数据库中使用不同的模式。如果这恰好是一个事实表,则最好加载到单个事实表中,并且如果大小过大,则使用分区。
在ETL方面,建议将数据提取、转换、加载到单独的模式(例如ETL)中的暂存表中,然后从那里加载到事实表。完成后,清空暂存表。
这些建议来自于《Microsoft Project Real》。此外,请记住,外键不能跨数据库使用。

这不是跨数据库连接,我可以理解这会更慢。这是将表连接在一起。由于这是一个仓库,ETL负责验证数据,因此没有FK和约束。 - Raj More

1

UNION 本质上执行了一个 select distinct,以便它可以删除重复记录。这本身可能会影响性能。您可以通过将其更改为 UNION ALL 来纠正这一点。

除此之外,您应该检查执行计划,以了解您正在遭受什么样的性能损失。我知道 SQL Server 甚至会在其他数据库中的表上使用索引,但是您在这里所做的仍然没有太多意义。如果正常使用场景是将所有表合并为一个 UNION,那么将它们分开到不同的数据库中几乎没有任何好处,建议使用表分区并将其全部保留在一个数据库中。


我会将其更改为 UNION ALL - Raj More

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接