时间维度在OLAP中是一个使用的很频繁的概念,通常要根据实际需求进行定义和架构,使其不仅能够满足现有基于时间分析的需求,还具有良好的可扩展性和可持续性。本文主要以SQL Server 2005为平台较为全面地介绍了时间维度的常见设计方法,并对其在OLAP中的架构方式进行了简单的阐述。
时间维度简介
在SQL Server 2005 Analysis Services(SSAS)中,时间维度是指那些属性表示时间段(如年、半期、季度、月和天)的维度类型。时间维度中的时间段可提供用于分析和报告的基于时间的粒度级别。属性将按层次结构进行组织,并且时间维度的粒度主要由历史数据的业务和报表需求决定。例如,商业智能应用程序中的大多数财务数据和销售数据使用月粒度或季度粒度。
一般情况下,Analysis Services中的多维数据集会以某种形式共用一个时间维度。有些情况也会需要用到多个时间维度,这些具体的时间维度架构将取决于数据的粒度和前端展示需求。但并非所有多维数据集都需要时间维度,如果多维数据集所要实现的所有功能都与时间无关,也就没有必要再定义一个时间维度了。
与时间维度相关的分析非常多,在此以销售为例:
1、 如何获得一周中的每一天的销售额?
2、 如何获得一年中每个月的销售总量?
3、 如果获得一年中每个财务月的销售总额?
4、 如果获得一年中所有节假日超市促销的销售总额?
日常使用的时间维度通常只有日期维度,大致如图1所示。
图1:日常使用的时间维度
时间维度设计注意事项
在Kimball的维度设计理念中提到,所有维度都应当使用代理键,这一点既有基于跟踪维度属性变化的需求,也有集成多个系统所带来的挑战。
时间维度可以使用代理键,也可以使用时间作为主键,比如日期维度可以使用日期作为主键,也可以使用有意义的数值作为代理键。具体来说,可以使用年月日顺序表示日期对应的整数,故2005年1月1日可以表示为20050101,如用theDate表示日期“2005-01-01”,则相应的timeKey可以使用下面的方法(T-SQL)生成:
以下是代码:
set timeKey = cast((left(convert(nvarchar,thedate,23),4)+substring(convert(nvarchar,thedate,23),6,2)+substring(convert(nvarchar,thedate,23),9,2))as int) |
对关系数据库来说,这样的做法可以显著提高查询性能,同时也简化实现基于日期的划分,并且划分也变得容易理解。
但也并不是所有情况下都可以教条地使用代理键,对于一个日期属性,当其具有业务上的意义时才使用代理键。
时间维度分类
在SSAS中,时间维度按照存储的方式不同分为两类:
1、普通时间维度:与其它维度类似,时间维度也使用维度表提供的维度属性,事实数据表通过外键与时间维度关联。时间维度存在一个单独物理数据表。
2、服务器时间维度:通过SSAS基于时间段定义的一个虚拟维度,通过总线矩阵建立度量值组与时间维度之间的关系。
时间维度与常规维度的区别
时间维度在本质上与任何其它标准维度没有区别。虽然如此,在SSAS中,一旦定义了时间维度,便具备了比其它标准维度更方便的功能:这一点主要体现在时间智能上。