什么是Fact(事实)维度关系

开发过SSAS Cube的开发人员应该都知道,Cube的维度用法中有一种叫Fact(事实)关系类型,如下图所示:

Fact(事实)维度关系就如同上面截图中红框中的描述一样,指的是一张表即是事实表又是维度表,也就是数据仓库中通常说的“退化维度”。比如在本例中我们的FactInternetSales(FactInternetSales表在数据源视图中的FriendlyName是Internet Sales Facts,所以在Cube中FactInternetSales表显示的是Internet Sales Facts这个名字如下图所示)表既是事实表又是维度表,如下图所示我们看到维度Internet Sales Order Details用的就是FactInternetSales表的列来构建的。

但是在Cube中我们发现FactInternetSales表也是事实表:

所以FactInternetSales表既是事实表又是维度表,维度Internet Sales Order Details和度量值组Internet Sales Facts其实都是引用的同一张数据库表FactInternetSales,那么我们就可以在维度用法中将维度Internet Sales Order Details和度量值组Internet Sales Facts之间的关系定义为Fact(事实)关系如下图所示:

从上图中我们可以看到Fact(事实)关系并不像Regular(常规)和Referenced(引用)关系一样要求设置维度表和事实表之间是通过什么字段来进行关联的,Fact(事实)关系不需要进行任何关联字段的设置。这是因为Fact关系默认会将维度表的Key属性中KeyColumns的列和事实表的主键列进行关联,其中事实表的主键列也可以是在SSAS项目数据源视图(Data Source Views)中定义的逻辑主键(Logical Primary Key)如下图所示,如果数据库中的表或视图没有定义主键,其实也可以在SSAS的数据源视图中为表或视图定义逻辑主键。

如下图所示我们看到维度Internet Sales Order Details的Key属性是Internet Sales Order

而我们可以从下图看到Key属性Internet Sales Order中的KeyColumns包含了FactInternetSales表的SalesOrderNumber和SalesOrderLineNumber这两列数据

而事实表FactInternetSales的主键列也是SalesOrderNumber和SalesOrderLineNumber这两列

所以维度Internet Sales Order Details和度量值组Internet Sales Facts之间设置的Fact关系,实际上就是使用了FactInternetSales表的SalesOrderNumber和SalesOrderLineNumber这两列做Join来进行Cube的相关运算的。

我们使用MDX语句可以查看到维度Internet Sales Order Details成功地切割了度量值组Internet Sales Facts的[Sales Amount]数据。

Fact(事实)维度关系的维度可以包含多张表

实际上维度Internet Sales Order Details如果包含了FactInternetSales表以外的表,也可以和度量值组Internet Sales Facts设置为Fact关系,如下图所示我们将DimSalesTerritory(FriendlyName是Sales Territory)表的SalesTerritoryRegion列加入了维度Internet Sales Order Details作为一个属性Sales Territory Region,所以实际上现在维度Internet Sales Order Details用到了两张表FactInternetSales和DimSalesTerritory。

从下图中可以看到,我们使用MDX语句成功地用Internet Sales Order Details维度的Sales Territory Region属性切割了度量值组Internet Sales Facts的[Sales Amount]数据。

错误地配置Fact(事实)维度关系

我们前面说了Fact关系是通过维度的Key属性的KeyColumns列和事实表的主键列做Join来进行Cube运算的。那么如果维度的Key属性设置了错误的KeyColumns列,那么就会导致在处理Cube的时候Fact关系会报错或得到不正确的计算结果。例如下图中我们胡乱地更改了维度Internet Sales Order Details的Key属性Internet Sales Order中的KeyColumns为FactInternetSales表的ShipDateKey和UnitPrice两列。

我们可以看到在Cube的维度用法中Fact关系立马出现了错误,提示事实表主键列的数据类型和维度表Key属性中KeyColumns列的数据类型不一致。

所以正确地设置维度表Key属性中的KeyColumns列对于Fact关系来说至关重要,要特别谨慎。

Fact(事实)关系和Regular(常规)关系有何不同

前面我们说了Fact维度关系就是用维度表Key属性中KeyColmuns列和事实表的主键列做Join来做Cube计算的,那么实际上我们完全可以把Fact关系改为Regular(常规)维度关系,因为Regular关系实际上也是做维度表和事实表的键值Join进行Cube运算,只不过你要在Regular关系中指定用哪些列来做为Join列。比如下图中我们将维度Internet Sales Order Details和度量值组Internet Sales Facts之间的关系从Fact改为了Regular,并指定使用维度Internet Sales Order Details中Key属性Internet Sales Order的KeyColumns列SalesOrderNumber和SalesOrderLineNumber,映射到事实表的SalesOrderNumber和SalesOrderLineNumber列来做Regular关系的Join运算。

在处理Cube后,我们使用和前面相同的MDX做查询,得到了和Fact维度关系相同的查询结果:

这说明维度用法中的Fact关系完全可以由Regular关系来替代,那么为什么Cube中需要设置Fact关系呢?实际中我们测试下来,本例中将维度Internet Sales Order Details和度量值组Internet Sales Facts设置为Fact关系后,MDX的查询速度要远远好于Regular关系,虽然MDX语句和查询结果都是相同的,但是Fact关系的性能要比Regular关系好很多,那么说明Cube对Fact关系的运算是经过特殊优化过的,我们知道Fact关系的维度表和事实表都是同一张数据库表,那么Cube在使用维度表切割事实表数据的时候肯定进行了更快捷的运算,这一点也是Fact关系的优势所在。

SqlServer Analysis Service的事实维度关系的更多相关文章

  1. 【转载】Analysis Service Tabular Model #002 Analysis services 的结构:一种产品 两个模型

    Analysis Service 2012 Architecture – One Product, Two Models 在之前SQL Server 2008 R2 版本中的分析服务实际上只有一个版本 ...

  2. 【转载】Analysis Service Tabular Model #003 Multidimensional Model VS Tabular Model 我们该如何选择?

    由于Multidimensional Model 和 Tabular Model 并不能互相转换, 所以在项目之初就应该要考虑好选择哪一种模型进行开发. 以下只是一些建议: Licensing 许可和 ...

  3. Service和Thread的关系及如何启用Service,如何停用Service

    Service和Thread的关系: 不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会 ...

  4. http 连接 analysis service (ssas)

    当数据仓库搭建好后,我们就可以通过sqlserver的管理工具查看服务器上的数据集了.但是这样挺不方便的,如果要远程访问,那么就可以通过http来连接数据仓库.要配置数据仓库http连接非常的简单.如 ...

  5. 微软BI 之SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)

    这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact ...

  6. fleet中service之间的依赖关系

    最近有人在topcoder上提出使用fleet在集群上部署service时有时候会发现,当启动依赖于整个集群服务的service时,只会检查那个service所在机器的依赖关系,这样就会造成一些问题, ...

  7. Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)

    这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...

  8. Android Service和Thread的关系

    不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...

  9. 【转】Android开发:Service和Thread的关系

    不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...

随机推荐

  1. 李洪强漫谈iOS开发[C语言-052]-for循环

  2. HTTP协议及其请求头分析

    HTTP协议及其请求头分析 HTTP协议及其请求头分析   众所周知,Internet的基本协议是TCP/IP协议,目前广泛采用的FTP.Archie Gopher等是建立在TCP/IP协议之上的应用 ...

  3. PCL Show Point Cloud 显示点云

    在使用PCL库的时候,经常需要显示点云,可以用下面这段代码: #include <pcl/visualization/cloud_viewer.h> pcl::PointCloud< ...

  4. Qt Load and Save Image Dialog 加载图片对话框

    在Qt中,我们想要通过对话框来打开某一个图片,可以通过使用QFileDialog来快速实现,参见以下代码: QString fileName = QFileDialog::getOpenFileNam ...

  5. Linux中下载、解压、安装文件

    一.将解压包发送到linux服务器上: 1.在windos上下载好压缩包文件后,通过winscp等SFTP客户端传送给linux 2.在linux中通过wget命令直接下载 #wget [选项] [下 ...

  6. jq制作好看的导航显示效果

    先上个效果图: 在关于页面时, 在点击邻居管理后, 实现所在页面的提示,相当于文字导航. 实现方法: js: var a,b; function admin_op(a,b){ if(b==0){ hi ...

  7. [转]Oracle数据库ASH和AWR的简单介绍

    在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容.       1.10g之前 用户的连接将产生会话,当 ...

  8. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  9. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  10. ExtJS笔记 Grids

    参考:http://blog.csdn.net/zhangxin09/article/details/6885175 The Grid Panel is one of the centerpieces ...