【问题标题】:Is it more efficient to build a cube off of tables or views?从表或视图构建多维数据集是否更有效?
【发布时间】:2012-10-31 23:49:49
【问题描述】:

在我注意到我被要求处理的一个系统有一个完全基于视图的立方体后,我开始思考这个问题。我注意到这些视图都加入了其他表/视图,并且视图也有逻辑编码到它们中(if、case 语句以及 convert 语句、连接等)。这一切对我来说似乎很可怕,但这让我想知道是否应该将他们的数据源建立在视图之外的立方体上?

对我来说,表格更有意义。它可以防止在数据源中进行昂贵的连接,并且不容易出现由于视图执行的转换而可能发生的错误。但是,我仍然看到很多人使用视图作为多维数据集的数据源。这里有最佳实践吗?我是否可能错过了视图在用作数据源时提供的一些优势?

【问题讨论】:

    标签: sql sql-server ssas olap


    【解决方案1】:

    视图是将 SSAS 与表隔离的重要层 - 与其说与列更改无关,不如说与不需要的行无关。如果没有视图,SSAS 将始终处理表中的每一行。一个典型的例子是具有 SCD 类型 2 行的维度表,其中多维数据集只需要“当前”行。其他常见情况是限制测试数据或提供 SSAS 分区。

    这些视图最好保持简单,即没有复杂的连接、CTE、计算列等。这些要求最好在 ETL 层中解决 - 在 SSAS 层中测试/调试/支持它们很痛苦。

    【讨论】:

      【解决方案2】:

      如果您要根据表而不是视图构建多维数据集,您将如何将数据放入表中?最合乎逻辑的方法是从视图中加载表。无论您需要一些业务逻辑层来填充您的表,无论是视图还是 ETL 流程。

      这意味着您在给定时间将数据“快照”到表中,这可能意味着当您构建多维数据集时您的数据已过期。

      这确实是一个性能问题。在以下情况下,将表(或索引视图)创建为多维数据集源可能会有所帮助:

      1. 您的源数据没有太大变化(即每天批量加载就可以了)
      2. 您需要经常从多维数据集数据钻取到关系(表或视图)数据,而您的视图引入了性能问题

      如果您只使用视图来提供多维数据集(而不是详细钻取),那么使用视图可能会更好,因为在从视图构建多维数据集时只会导致一次性能损失,而不是首先导致一次性能损失从视图构建表格,然后另一个(当然更少)从表格中构建立方体。

      【讨论】:

      • 我不确定我是否遵循。您的视图将基于表格,而这些表格是“快照”,那有什么不同?
      • 源表是“快照”吗?或者他们的表格,例如,在每 10 秒更新一次的实时 ERP 系统中?视图只是业务逻辑。因此,如果您说“取消视图并仅从表构建”,您仍然需要在某处复制该业务逻辑!除非您说要使用完全不同(即未连接)的数据集来为多维数据集提供数据。
      【解决方案3】:

      不,它没有更快或更慢。

      通常的做法是根据视图而不是表构建多维数据集。

      它对基础表的更改提供了一定程度的隔离。它允许设计以不同方式对基础表的信息进行分组。它允许发生非规范化。只是几个原因。

      例如,您可以轻松地更改视图中的列名称,该视图仅用于为多维数据集提供服务。另外,您可以命名视图列,以便它们模拟多维数据集的域,而不是表中给出的名称。

      【讨论】:

      • 我猜它确实提供了对正在添加的新字段的绝缘,但它没有看到它对被删除的字段提供绝缘。还有必须维护额外代码(视图)的开销。
      • 对于删除字段,您始终可以指定NULL as DeletedField 或在视图定义中对已删除字段有意义的任何内容。显然,这只对非必要字段有帮助,但是如果不重新编写多维数据集,您将永远不会删除重要字段。视图本身成为您与多维数据集映射的关系,当您的多维数据集获取数据时,它实质上是SELECT * FROM MyView。对于任何类型的系统集成,它都是标准的最佳实践。这意味着您不必仅仅因为数据库逻辑发生变化而重新编译您的应用程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2012-08-01
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多