SqlServer Analysis Service的事实维度关系
什么是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的事实维度关系的更多相关文章
- 【转载】Analysis Service Tabular Model #002 Analysis services 的结构:一种产品 两个模型
Analysis Service 2012 Architecture – One Product, Two Models 在之前SQL Server 2008 R2 版本中的分析服务实际上只有一个版本 ...
- 【转载】Analysis Service Tabular Model #003 Multidimensional Model VS Tabular Model 我们该如何选择?
由于Multidimensional Model 和 Tabular Model 并不能互相转换, 所以在项目之初就应该要考虑好选择哪一种模型进行开发. 以下只是一些建议: Licensing 许可和 ...
- Service和Thread的关系及如何启用Service,如何停用Service
Service和Thread的关系: 不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会 ...
- http 连接 analysis service (ssas)
当数据仓库搭建好后,我们就可以通过sqlserver的管理工具查看服务器上的数据集了.但是这样挺不方便的,如果要远程访问,那么就可以通过http来连接数据仓库.要配置数据仓库http连接非常的简单.如 ...
- 微软BI 之SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)
这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact ...
- fleet中service之间的依赖关系
最近有人在topcoder上提出使用fleet在集群上部署service时有时候会发现,当启动依赖于整个集群服务的service时,只会检查那个service所在机器的依赖关系,这样就会造成一些问题, ...
- Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)
这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...
- Android Service和Thread的关系
不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...
- 【转】Android开发:Service和Thread的关系
不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...
随机推荐
- supervisor、pm2、forever坐下来聊聊
supervisor 是开发环境用.或者用nodemon,node-dev 代替了supervisor 和 nodemon,它和coffeescript兼容最好. forever 管理多个站点,每个站 ...
- eclipse中中文字体过小
转自 http://www.cnblogs.com/HD/p/3654139.html
- 常用JS表单验证方法
/*输入:str返回:如果全是空返回true,否则返回false*/function isNull(str) {if (str == "") return true;var reg ...
- 科技来电:不容错过的win10轻度美化攻略
作为微软不择手段采用弹框.限时.警告等方式强推win10的结果, win10市场占有率大增,微软高兴了,可用户苦了,吹洗剪+杀马特般的metro&传统混血开始菜单.鼻青脸肿般的任务栏.单一颜色 ...
- Ubuntu14.04配置记录
公司配的台式机,新装了ubuntu,记录下配置过程. vim sudo apt-get install vim unzip sudo apt-get install unzip unrar sudo ...
- C遇到的问题
1. stdout-------printf输出到stdout,并在终端打印 stderr--------perror错误输出到stderr,并在终端打印 2. usleep(1)//代表一微妙 sl ...
- IOS彩票第一天基本框架搭建
*****初始化 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionar ...
- eval 与 Function
var json='{"name":"lee","age":"15"}' function test () { var ...
- oracle 11g 通过在线重定义方式修改表结构
今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为"0"的值进行抽取,抽取之后更新HAVE_FLAG为其他值, ...
- centos桌面使用
firefox添加flash插件 [root@bogon home]# cp libflashplayer.so /usr/lib64/mozilla/pl pl plugins/ plugins-w ...