在进行数据建模时,设计人员往往会遇到这样困境,即在设计数据仓库架构时该如何塑造逻辑属性。Oracle 11g中一个叫做虚拟列的新特性可以解决这一难题,它通过降低对象管理和存储能耗的方式来显示逻辑属性。此外,使用虚拟列可以提升数据库可用性、可管理性以及其它性能。虚拟列可以辅助建模人员实现简单、直观、快速的设计。
逻辑属性
逻辑属性通常指的是基于表达式或函数所得出的结果。这样的属性分为两大类:计算值与派生值。计算值代表了数学公式所得到的结果,下面的例子添加了两列,以计算值为结果:
base salary + commission = total salary
另一方面,派生值是基于逻辑的。下面的例子添加相同的两列,以派生值为结果:
if base salary + commission > 100000 then 'Highly Compensated' end
设计窘境
在Oracle 11g之前,数据建模者要么需要将逻辑属性以物理表列的形式显示,要么需要在视图中虚拟所有的值。但是这两种方法的效果都不是很理想。
以物理表列的形式存储逻辑属性可以使value能够被索引并且显示在用户面前。用这样的方式能够收集到更加精确的统计数据,从而可以做出最佳决策。然而它同样意味着更大的存储压力。考虑到数据仓库中的数据将呈现指数增长的情况,许多设计人员转而选择使用视图来对属性建模。
使用视图的方式可以达到显示逻辑属性的目的,并且不会造成巨大的存储压力。一个视图可以被视为一个存储查询,它是SQL执行的具体化结果。因此,在视图中不能收集优化的统计数据。优化器没有其它选择,只能去猜测成本以及表达式结果的基数。尽管视图列不能被索引或约束,但是Oracle 8i引入了基于函数的索引,它提供的优化器可以对实际统计数据进行查询优化。视图以及基于函数的索引看似是不错的选择,但是使用这一方式将会导致额外的数据库对象管理,从而导致了数据仓库的复杂性。
Oracle 11g解决方案
Oracle 11g中引入的虚拟列功能为数据建模人员提供了一个设计逻辑属性的优化方案。虚拟列并不存储于硬盘之上,而是在SQL执行过程中进行运算。它同基于函数的索引(FBIs)共享了大部分代码路径,并且还提供了额外的能见度。除物理存储特性之外,虚拟列同视图相比还有另外一个巨大的优势。在虚拟列中,建模人员可以收集优化的统计数据,并且可以对这些列进行索引和约束,甚至可以用在分区表中。这使得优化器可以围绕查询访问来做出基于事实的智能决策。总的来说,使用虚拟列可以达成数据建模的最终设计目标,并且不会造成额外的存储压力和对象成本。