代理键(Surrogate key)一般是指维度表中使用顺序分配的整数值作为主键,也称为“代理关键字”。代理关键字用于维度表和事实表的连接。
自然键(Natural Key)是业务系统中已经存在的,通常是具有一定业务含义的一个字符型的标志符,可以唯一地标志维度表中的每一条记录。比如组织机构代码等。
在维度模型中采用代理键的好处有很多。例如,将维度与源系统的更改隔离开来,以及启用维度成员的历史版本控制。另外,数据仓库中的查询性能 是将代理键合并到维度模型中的另一个主要原因,也这不应被忽视。代理键是一个非智能的、系统生成的、分配为维度主键的数字(int或smallint)值。为了理解维度的粒度,还必须定义替代键(即自然键)。这对于在任何数据仓库环境中跨多个事实表和分析区域启用统一维度至关重要。
一些数据库和数仓设计人员认为由于硬件性能能力的提高,不需要代理键。但是,由于数据量不断扩大,查询量不断增加,查询的数据量也越来越大,因此对于每个应用程序和数据库管理系统,使查询连接尽可能高效非常重要。
根据最近的OLAP调查,最突出的问题是查询性能不佳。使用代理键是优化维度查询的首要方法,主要有三个方面的原因。
一、简化的高性能连接
使用代理键将简化事实和维度表之间的连接。在事实表或事实表索引中扫描单个较小的数值(通常为4个字节(int)或2个字节(smallint)),而不是一个大字符值或混合数据类型的多个属性。显然,对单个小数值的连接会更快。维度具有由业务键(在源系统中提供唯一性的属性)和必要的元数据标记(例如,源系统标识符、生效日期)组成的多部分自然键非常常见。自然键描述了维度表的唯一性和粒度。识别和记录与自然键和代理键相关联的元数据至关重要。
这些多部分的自然键通常由字符值组成,当您的事实表包含数百万或数十亿条记录时,这些字符值加起来可能会占用大量空间。BI需要从数据库中检索大量记录是很常见的,即使呈现给用户的结果通常是汇总的。
在维度模型中,需要查看维度成员在事实发生日期出现时的状态是很常见的。如果使用自然键来处理维度的变化,对维度成员的更改将导致现有记录被“停用”。例如,将非活动日期设置为前一个日期,并插入当前值进入新纪录。如果没有代理键,就无法执行join来准确地连接事实表和维度表。相反,必须执行低效的日期范围操作。
示例:
select d.col1, d.col2, sum (f.amt)
from dimension d, fact f
where d.col3 = f.col3
and f.tran_date between d.effective_date and d.inactive_date
and d.col4 = “Widgets”
group by d.col1, d.col2
当使用代理键时,优化查询的任务减少了,只有一种可能的方法将事实表连接到维度。这样做的一个附带好处是用户不会错误地连接维度和事实表。在上面的例子中,如果用户忘记在事实交易日期包括范围连接,可能会导致重复计算。
任何必须对BI工具生成的复杂分析查询进行故障排除或调整的人都会喜欢通过使用代理键来简化维度连接。一个事实表通常有许多关联的维度表,十个维表连接到一个事实表的情况并不少见。此外,许多维度可能与一个事实表有多种关系(角色)。通常有许多类型的日期需要用事实记录表示,每一种都需要连接到日期维度。例如,在订单事实表上,您可能有下订单日期、订单发货日期、订单发票日期等。
二、减少 I/O 操作
虽然磁盘空间(相对)便宜,但通常必须将许多事实表行读入内存以满足查询。关系数据库使用页面执行 I/O。页面可以包含许多数据或索引行,因此如果页面包含满足查询所需的行,则数据页(包含其中包含的所有行)被读入内存。使用自然键会增加事实表的宽度,因此可以在数据页上存储更少的事实表行。结果是增加了I/O操作,这是性能瓶颈的主要原因。
ETL处理期间花费的大量时间可归因于索引构建。使用代理键将减少构建和维护索引所花费的时间,并将减少分配给索引的空间量。因此,索引将更加紧凑和高效。
三、启用 RDBMS 优化
使用代理键有助于启用专为与维度模型一起使用而开发的数据库优化,例如位图索引、星形转换。
由于为维度模型启用参照完整性会影响性能,因此通常不会在数据库中强制执行外键约束。然而,事实表中的外键通常在列上有一个bitmap或b-tree索引。与b-tree索引不同,大多数bitmap索引不能由多列组成。bitmap是专门为BI应用程序开发的,可以对查询性能产生巨大影响。
为了让RDBMS查询优化器使用星型转换执行查询,需要一个带有bitmap索引的单部分外键。星型转换将“重写”一个查询,通过使用利用外键上的bitmap索引的子查询来优化它。
结论
硬件和软件性能的提高加数据存储成本的降低可能会促使人们放弃使用代理键。更强大的基础设施并不能否定对良好数据架构的需求。在维度模型中使用自然键通常是错误的。除非有非常具体、有效和合理的理由,否则应该将代理键的使用视为维度模型的标准。除了其他数据体系结构的好处外,代理键还具有显著的性能优势。