3

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

在拉入立方体时,我基本上是在这样做:

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

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

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

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

4

4 回答 4

3

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

关于您的评论:

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

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

于 2009-12-01T13:21:42.747 回答
3

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

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

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

于 2009-12-01T13:45:18.833 回答
2

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

当涉及到 ETL 时,建议是将 ETL 放入一个单独的模式中的暂存表——比如 ETL——在同一个数据库中,并从那里加载事实表。完成后,您将截断临时表。

这些建议来自Microsoft Project Real

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

于 2009-12-01T14:03:45.277 回答
1

AUNION本质上执行 aselect distinct以便它可以删除重复记录。这将(可能)本身损害性能。您可以通过将其更改为UNION ALL.

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

于 2009-12-01T13:55:44.670 回答