【问题标题】:Cross Database Unions跨数据库联合
【发布时间】:2009-12-01 13:15:53
【问题描述】:

我的仓库数据集市数据分布在同一台服务器上的 3 个数据库中。这是一个概念验证项目,其中包含三个已加载到各个数据库中的数据提取。

在拉入立方体时,我实际上是在这样做:

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

我真的应该将数据整合到一张表中吗?这会让我的处理速度更快吗?

我对磁盘空间没有任何问题 - 我想实施最佳解决方案。

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

【问题讨论】:

  • +1 有趣。让我们看看答案。
  • 为什么你的仓库分成三个数据库?

标签: sql sql-server performance sql-server-2008 data-warehouse


【解决方案1】:

考虑使用 SQL Server 的一流分区来联合您的表(而不是自己动手)。如果您总是选择每个数据点,那么也许是的,拉出多个磁盘会更快。

但是为什么有多个数据库呢?您总是可以将三张表堆叠成一张表,但要在三个一起进行 RAID 的驱动器上实现一张表。如果您追求的是速度,这是一个更明确的解决方案。

只有当你选择了集合中特定的相邻部分时,联合才有意义。但是根据您的 OP,您选择了所有内容,因此消除了这种好处。

【讨论】:

  • 我正在运行报告的多维数据集中进行分区。
  • 如果你在做报告,你为什么提到你正在将表格联合起来?您什么时候查询过每个数据点?
  • 我从 SQL Server 的事实表中查询所有内容,我的 SSAS 多维数据集包含报告所需的所有聚合。不过,我一定错过了你问题的主旨。请详细说明
【解决方案2】:

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

关于您的评论:

性能成本并没有那么大,但是联合执行合并连接,这会带来一些开销。

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

【讨论】:

  • 你能帮我理解为什么处理一个表而不是 UNION 中的 3 个表会更快吗?
  • UNION ALL 确实是我想要的。谢谢!
【解决方案3】:

跨数据库查询(有点)比数据库内查询慢,如果您需要三个单独的表,建议在同一个数据库中使用不同的模式。如果这恰好是一个事实表,那么最好加载到单个事实表中,如果大小恰好太大,则使用分区。

当涉及到 ETL 时,建议是将 ETL 放入同一数据库中的单独架构中的暂存表(例如 ETL)中,然后从那里加载事实表。完成后,您将截断临时表。

建议来自 Microsoft Project Real

还要记住,外键不能跨数据库使用。

【讨论】:

  • 这不是跨数据库 JOIN - 我可以理解会慢一些。这是将表连接在一起。由于这是一个仓库,ETL 负责验证数据,因此没有 FK 和约束。
【解决方案4】:

UNION 实质上执行select distinct,以便它可以删除重复记录。这将(可能)本身损害性能。您可以通过将其更改为 UNION ALL 来纠正它。

除此之外,您还应该检查执行计划,看看您获得了什么样的性能影响。我确实知道 SQL Server 甚至会在其他数据库中的表上使用索引,但是您在这里所做的仍然没有多大意义。如果正常的使用场景是UNION 将所有表放在一起,我建议使用表分区并将其全部保存在一个数据库中,几乎没有充分的理由将它们分开到不同的数据库中。

【讨论】:

  • 我会把它改成UNION ALL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多