从表或视图构建多维数据集是否更有效?

时间:2012-10-31 23:49:49

标签: sql sql-server ssas olap

在我注意到一个我被要求处理的系统有一个完全基于视图的立方体后,我开始思考这个问题。我注意到那些视图都加入了其他表/视图,并且视图也有逻辑编码到它们中(如果,case语句以及转换语句,concatation等)。这一切对我来说都很可怕,但它让我想知道是否应该根据视图建立一个多维数据集的数据源?

对我来说桌子更有意义。它可以防止数据源中的昂贵连接,并且也不容易因视图执行的转换而发生错误。但是,我仍然看到很多人使用视图作为多维数据集的数据源。这里有最好的做法吗?我是否可能忽略了视图在用作数据源时所带来的一些优势?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

不,它不会更快或更慢。

通常的做法是在视图而不是表格上构建一个多维数据集。

它对基础表的更改提供了一定的绝缘性。它允许设计以不同方式将信息分组到基础表。它允许非规范化发生。只有几个原因。

例如,您可以轻松更改视图中的列名,仅用于维护多维数据集。另外,您可以命名视图列,以便为多维数据集的域建模,而不是在表中给出的名称。

答案 2 :(得分:1)

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

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

这真的是一个性能问题。在以下情况下将表(或索引视图)创建为多维数据集源可能是有益的:

  1. 您的源数据变化不大(即每日批量加载没关系)
  2. 您需要经常从多维数据集数据钻取到关系(表格或视图)数据,并且您的视图会引入性能问题
  3. 如果您只是使用视图来提供多维数据集(而不是详细信息),那么您最好使用视图,因为从视图构建多维数据集时只会产生一次性能损失,而不是首先产生一次性能影响从视图中构建表格,然后从表格中建立另一个(不可否认的是)建立立方体。