代码之家  ›  专栏  ›  技术社区  ›  Raj More

跨数据库联合

  •  3
  • Raj More  · 技术社区  · 15 年前

    当拉入一个立方体时,我基本上是这样做的:

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

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

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

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

    4 回复  |  直到 13 年前
        1
  •  2
  •   Damir Sudarevic    15 年前

    如果您 需要 三个单独的表,建议在同一个数据库中使用不同的模式。如果这恰好是一个事实表,那么最好将其加载到单个事实表中,并在大小太大时使用分区。

    当涉及到ETL时,建议将ETL放入同一个DB中的独立模式(如ETL)中的临时表中,并从中加载事实表。完成后,将截断临时表。

    建议来自 Microsoft Project Real .

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

        2
  •  3
  •   Mark Canlas    15 年前

    考虑使用SQL Server的第一类分区联合表(而不是自己进行)。如果您总是选择每个数据点,那么可能是的,拔出多个磁盘更快。

    但是为什么有多个数据库呢?您总是可以将三个表堆叠到一个表中,但是在三个驱动器上实现一个表,并对其进行突袭。如果你追求的是速度,这是一个更清晰的解决方案。

    只有在选择了集合中特定的、相邻的部分时,联合才有意义。但是根据你的操作,你选择了所有的东西,这样就消除了这种好处。

        3
  •  3
  •   NullUserException Mark Roddy    13 年前

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

    关于您的评论:

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

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

        4
  •  1
  •   Donnie    15 年前

    A UNION 基本上执行 select distinct 以便删除重复的记录。这将(潜在地)损害性能。你可以把它改成 UNION ALL .

    除此之外,您还应该检查执行计划,看看您得到了什么样的性能影响。我知道,即使在其他数据库的表上,SQL Server也会使用索引,但您在这里所做的仍然没有多大意义。我建议使用表分区,如果正常使用场景是 联合 所有的表放在一起,几乎没有什么好的理由将它们分隔成不同的数据库。