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 ...
随机推荐
- 使用Uboot启动内核并挂载NFS根文件系统
配置编译好内核之后,将生成的内核文件uImage拷贝到/tftpboot/下,通过tftp服务器将内核下载到开发板,使用命令:tftp 31000000 uImage.下载完成之后配置bootargs ...
- webservice的Axis2入门教程java版
本文转自百度文库 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebServi ...
- SQLite datatype
NULL. The value is a NULL value. INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or ...
- 360safe安全卫士防网站攻击源码
近段时间,公司网站老被攻击,于是研究起防止攻击方法,当然无外乎就是SQL注入之类的问题,无意间发现了一个360安全卫士提供的源码,觉得挺好的,咋们暂且不说防攻击效果,至少思路是很好的,奉献给大家,大家 ...
- pthread_creat()解析及需注意的地方
函数声明 int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn ...
- Jquery局部刷新小案列
/* 调用showTest()方法去后台拿到处理数据后返回到part.jsp页面,main.jsp再调用html()方法 和显示的结果集show()方法把part.jsp显示到当前的页面,实现局部页面 ...
- ZK tree使用mold
前台Tree.zul <?page title="Tree使用" contentType="text/html;charset=UTF-8"?> & ...
- 修改RectTransform的宽度和高度
rectTransform.sizeDelta = new Vector2( width, height);
- ffmpeg命令行
ubuntu下简单安装ffmpeg sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-nextsudo apt-get update sudo a ...
- eclipse创建web项目
总结为3步: 必备环境: Eclipse jee Tomcat 1.创建services 2.创建dynamic web project项目 3.WebContent路径下创建index.jsp 运行 ...