日期:2014-05-16 浏览次数:20533 次
大家对通常oracle中的cluster的理解是不准确的,经常和sql server中的cluster index混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的data row存储到同一block上。在sql server中的cluster index强制行根据index key按存储顺序存储,这一点和oracle中的IOT类似。??
?
从下图中我们可以清楚的看到cluster?和非cluster?的一组table的物理存储的区别。在cluster中,单个block上的数据可能来自多个table,概念上可以存储“预连接”的数据。单个table也可以使用cluster,即根据某些column按组存储数据。如图中,所有部门ID为?20和?110的部门信息和员工信息的数据都将存储在同一block。注意,这里存储的并不是排序的数据(那是IOT的任务),存储的是按部门ID分组集合的数据,是以heap的方式存储的。因此,部门20刚好和部门110相邻,而部门99和部门100相距很远(硬盘的物理位置)。
当单个block放不下时,额外的block将链接到最初的block,来包容溢出的数据,这种方式和在IOT中溢出block非常相似。
现在我们看看如何创建一个cluster。在cluster中创建一系列table是很简单的,对象存储定义如PCTFREE,PCTUSED,INITIAL都是和cluster相关的,而不是和table相关。这是因为在cluster中存储了若干table,每个table在同一个block中拥有不同的PCTFREE没有意义。