在 DMS 表空间中如何添加和扩展容器
创建表空间时,会创建其表空间映射并对齐所有初始容器,以使它们都从分割区 0 开始。这意味着数据将均匀分布在所有表空间容器上,直到个别容器已满。(请参阅示例 1。)
ALTER TABLESPACE 语句允许向现有表空间添加容器或扩展容器,以增加其存储容量。
添加比现有容器小的容器会导致数据分布不均匀。这可能导致并行 I/O 操作(如预取数据)的执行效率比对大小相同的容器执行的效率要低。
向表空间添加新容器或扩展现有容器时,可能发生表空间数据的重新平衡。
重新平衡
添加或扩展容器时的在平衡过程涉及将表空间扩展数据块从一个位置移动到另一位置,这是通过试图保持数据在表空间内成为分割区来完成的。
在重新平衡期间不会限制对表空间的访问;可以像平常一样删除、创建、填充和查询对象。但是,重新平衡操作可能对性能有很大的影响。如果需要添加多个容器,并且计划重新平衡容器,则应在单个 ALTER TABLESPACE 语句中同时添加它们,以免数据库管理器不得不多次重新平衡数据。
表空间高水位标记在重新平衡过程中起着关键作用。高水位标记是表空间中分配的最高页的页数。例如,表空间有 1000 页,扩展数据块大小为 10,则结果为 100 个扩展数据块。如果第 42 个扩展数据块是表空间中最高分配的扩展数据块,则高水位标记是 42 * 10 = 420 页。这与已使用的页不同,因为可能已经释放了高水位标记下的一些扩展数据块,所以它们可供复用。
在重新平衡启动之前,会根据所作的容器更改构建新的表空间映射。重新平衡程序将扩展数据块从由当前映射确定的位置移至由新映射确定的位置。重新平衡程序从扩展数据块 0 开始,一次移动一个扩展数据块,直到移动了持有高水位标记的扩展数据块为止。移动每个扩展数据块时,当前映射每次改变一块以使其看起来与新映射相似。当完成重新平衡时,对于当前映射和新映射,一直到持有高水位标记的分割区,看起来应完全相同。于是使当前映射与新映射看起来完全相同,重新平衡过程就完成了。如果扩展数据块在当前映射中的位置与它在新映射中的位置相同,则不移动该扩展数据块,并且不发生 I/O。
当添加新容器时,该容器在新映射内的位置取决于其大小及其分割集中其他容器的大小。若容器足够大,以至于它可以从分割集中的第一个分割区开始,并在分割集中的最后一个分割区处(或以外)结束,则将它使用该方法放置(请参阅示例 2)。若容器不够大,无法做到这一点,则它将在映射中定位为在分割集的最后一个分割区结束(请参阅示例 4。)这样做是为了最小化需要重新平衡的数据量。
注:
在下列示例中,容器大小未将容器标记计算在内。容器大小很小,仅用于说明目的,它们不是建议的容器大小。这些示例显示表空间中不同大小的容器,但建议使用相同大小的容器。
示例 1:
如果您创建的表空间有三个容器,扩展数据块大小为 10,并且容器分别为 60、40 和 80 页(6、4 和 8 个扩展数据块),则将创建带有映射的表空间,可进行如图 88 中所示的图解。
图 88. 带有三个容器和 18 个扩展数据块的表空间
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 11 119 0 3 0 3(1 和 2)
[1] [0] 0 15 159 4 5 0 2(0 和 2)
[2] [0] 0 17 179 6 7 0 1(2)
|
表空间映射中的标题是“范围编号”、“分割集”、“分割区偏移”、“根据范围寻址的最大扩展数据块编号”、“根据范围寻址的最大页编号”、“起始分割区”、“结束分割区”、“范围调节”和“容器列表”。
示例 2:
如果在示例 1 中向表空间添加了一个 80 页的容器,容器就大到足以从第一个分割区(分割区 0)中开始,并在最后一个分割区(分割区 7)中结束。它被定位为从第一个分割区中开始。结果表空间可进行如图 89 中所示的图解。
图 89. 带有四个容器和 26 个扩展数据块的表空间
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 15 159 0 3 0 4(0、1、2 和 3)
[1] [0] 0 21 219 4 5 0 3(0、2 和 3)
[2] [0] 0 25 259 6 7 0 2(2 和 3)
|
如果高水位标记在扩展数据块 14 以内,则重新平衡程序将从扩展数据块 0 开始,并且将把所有扩展数据块上移至 14(包括 14)。两个映射内的扩展数据块 0 的位置相同,所以不必移动此扩展数据块。扩展数据块 1 和 2 的情况相同。需要移动扩展数据块 3,所以从旧位置(容器 0 内的第二个扩展数据块)读取该扩展数据块并写至新位置(容器 3 内的第一个扩展数据块)。将移动此扩展数据块之后直到扩展数据块 14(包括扩展数据块 14)的每个扩展数据块。一旦移动了扩展数据块 14,当前映射看起来会像新映射,并且重新平衡程序将终止。
如果改变映射以使所有新添加的空间都在上限之后,则不需要重新平衡并且所有的空间都立即可用。如果改变映射以使部分空间在高水位标记之后,则分割区中在高水位标记之上的空间将是可用的。余下部分直到重新平衡完成才可用。
如果决定扩展容器,则重新平衡程序的功能相似。如果扩展容器以使它超出了分割集中的最后一个分割,则将扩展该分割集以适应这种情况并将相应地移出其后的分割集。结果是容器不会扩展到其后的任何分割集中。
示例 3:
以“示例 1”中的表空间为例。如果将容器 1 从 40 页扩展到 80 页,则新表空间将类似图 90。
图 90. 带有三个容器和 22 个扩展数据块的表空间
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 17 179 0 5 0 3(0、1 和 2)
[1] [0] 0 21 219 6 7 0 2(1 和 2)
|
示例 4:
考虑示例 1 中的表空间。若向它添加一个 50 页(5 个扩展数据块)的容器,则将以如下方式将该容器添加至新映射。容器大小不足以从第一个分割区(分割区 0)中开始,并在最后一个分割区(分割区 7)处或以外结束,因此将它定位为在最后一个分割区中结束。(请参阅图 91。)
图 91. 带有四个容器和 23 个扩展数据块的表空间
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 8 89 0 2 0 3(0、1 和 2)
[1] [0] 0 12 129 3 3 0 4(0、1、2 和 3)
[2] [0] 0 18 189 4 5 0 3(0、2 和 3)
[3] [0] 0 22 229 6 7 0 2(2 和 3)
|
要扩展容器,在 ALTER TABLESPACE 语句上使用 EXTEND 或 RESIZE 选项。要添加容器并重新平衡数据,在 ALTER TABLESPACE 语句上使用 ADD 选项。如果正在向已经有多个分割集的表空间添加容器,则可以指定想要向哪个分割集添加容器。为此,在 ALTER TABLESPACE 语句上使用 ADD TO STRIPE SET 选项。如果不指定分割集,则缺省行为将是向当前分割集添加容器。当前分割集是最新创建的分割集,而不是最后向其添加空间的分割集。
对分割集的任何更改可能导致对该分割集及其后的任何其他分割集的重新平衡。
可以通过使用表空间快照来监视重新平衡的进度。表空间快照可以提供关于重新平衡的信息,如重新平衡的开始时间、已经移动了多少个扩展数据块以及需要移动多少个扩展数据块。
没有重新平衡(使用分割集)
如果添加或扩展容器,并且添加的空间在表空间高水位标记之上,则不会发生重新平衡。
添加容器将总是在高水位标记下添加空间。换句话说,添加容器时,重新平衡通常是必要的。有一个选项可强制将新容器添加到高水位标记之上,它允许您选择不对表空间的内容重新平衡。此方法的一个优点是新容器可立即使用。不进行重新平衡这一选项仅在添加容器时才适用,在扩展现有容器时不适用。扩展容器时,仅当添加的空间在高水位标记之上时,才能避免重新平衡。例如,如果有许多大小相同的容器,并且按相同的量扩展它们,则扩展数据块的相对位置不会更改,并且不会发生重新平衡。
将容器添加到表空间中而不进行重新平衡可通过添加新的分割集来实现。分割集是表空间中的一组容器,数据在其上进行分割,且独立于属于该表空间的其他容器。现有分割集中的现有容器保持不变,而添加的容器成为新分割集的一部分。
要添加容器而不进行重新平衡,在 ALTER TABLESPACE 语句上使用 BEGIN NEW STRIPE SET 选项。
示例 5:
如果表空间有三个容器,扩展数据块大小为 10,并且容器分别为 30、40 和 40 页(分别为 3、4 和 4 个扩展数据块),则表空间可进行如图 92 中所示的图解。
图 92. 带有三个容器和 11 个扩展数据块的表空间
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 8 89 0 2 0 3(0、1 和 2)
[1] [0] 0 10 109 3 3 0 2(1 和 2)
|
示例 6:
在使用 BEGIN NEW STRIPE SET 选项添加 30 页和 40 页的两个新容器(分别为 3 和 4 个扩展数据块)时,不会影响现有范围;而是将创建一组新范围。这一组新范围是一个分割集,而最新创建的分割集称为当前分割集。添加了两个新的容器之后,表空间将类似图 93。
相应的表空间映射,如表空间快照中所示,类似如下:
范围 分割集 分割区 最大 最大 起始 结束 调节 容器
编号 偏移 扩展数据块 页 分割区 分割区
[0] [0] 0 8 89 0 2 0 3(0、1 和 2)
[1] [0] 0 10 109 3 3 0 2(1 和 2)
[2] [1] 4 16 169 4 6 0 2(3 和 4)
[3] [1] 4 17 179 7 7 0 1(4)
|
如果向表空间添加新的容器,并且未将 TO STRIPE SET 选项与 ADD 子句配合使用,则将把容器添加至当前分割集(最高分割集)。可以使用 ADD TO STRIPE SET 子句来将容器添加到表空间中的任何分割集。必须指定有效的分割集。
DB2 数据库 Linux 版、UNIX 版和 Windows 版使用表空间映射来跟踪分割集,并且添加新容器而不进行重新平衡通常将导致映射比对容器进行重新平衡时增长得快。当表空间映射变得过大时,如果试图添加更多容器,将接收到错误 SQL0259N。