在 DMS 表空間中如何添加和擴展容器
創(chuàng)建表空間時,會創(chuàng)建其表空間映射并對齊所有初始容器,以使它們都從分割區(qū) 0 開始。這意味著數(shù)據(jù)將均勻分布在所有表空間容器上,直到個別容器已滿。(請參閱示例 1。)
ALTER TABLESPACE 語句允許向現(xiàn)有表空間添加容器或擴展容器,以增加其存儲容量。
添加比現(xiàn)有容器小的容器會導(dǎo)致數(shù)據(jù)分布不均勻。這可能導(dǎo)致并行 I/O 操作(如預(yù)取數(shù)據(jù))的執(zhí)行效率比對大小相同的容器執(zhí)行的效率要低。
向表空間添加新容器或擴展現(xiàn)有容器時,可能發(fā)生表空間數(shù)據(jù)的重新平衡。
重新平衡
添加或擴展容器時的在平衡過程涉及將表空間擴展數(shù)據(jù)塊從一個位置移動到另一位置,這是通過試圖保持數(shù)據(jù)在表空間內(nèi)成為分割區(qū)來完成的。
在重新平衡期間不會限制對表空間的訪問;可以像平常一樣刪除、創(chuàng)建、填充和查詢對象。但是,重新平衡操作可能對性能有很大的影響。如果需要添加多個容器,并且計劃重新平衡容器,則應(yīng)在單個 ALTER TABLESPACE 語句中同時添加它們,以免數(shù)據(jù)庫管理器不得不多次重新平衡數(shù)據(jù)。
表空間高水位標(biāo)記在重新平衡過程中起著關(guān)鍵作用。高水位標(biāo)記是表空間中分配的最高頁的頁數(shù)。例如,表空間有 1000 頁,擴展數(shù)據(jù)塊大小為 10,則結(jié)果為 100 個擴展數(shù)據(jù)塊。如果第 42 個擴展數(shù)據(jù)塊是表空間中最高分配的擴展數(shù)據(jù)塊,則高水位標(biāo)記是 42 * 10 = 420 頁。這與已使用的頁不同,因為可能已經(jīng)釋放了高水位標(biāo)記下的一些擴展數(shù)據(jù)塊,所以它們可供復(fù)用。
在重新平衡啟動之前,會根據(jù)所作的容器更改構(gòu)建新的表空間映射。重新平衡程序?qū)U展數(shù)據(jù)塊從由當(dāng)前映射確定的位置移至由新映射確定的位置。重新平衡程序從擴展數(shù)據(jù)塊 0 開始,一次移動一個擴展數(shù)據(jù)塊,直到移動了持有高水位標(biāo)記的擴展數(shù)據(jù)塊為止。移動每個擴展數(shù)據(jù)塊時,當(dāng)前映射每次改變一塊以使其看起來與新映射相似。當(dāng)完成重新平衡時,對于當(dāng)前映射和新映射,一直到持有高水位標(biāo)記的分割區(qū),看起來應(yīng)完全相同。于是使當(dāng)前映射與新映射看起來完全相同,重新平衡過程就完成了。如果擴展數(shù)據(jù)塊在當(dāng)前映射中的位置與它在新映射中的位置相同,則不移動該擴展數(shù)據(jù)塊,并且不發(fā)生 I/O。
當(dāng)添加新容器時,該容器在新映射內(nèi)的位置取決于其大小及其分割集中其他容器的大小。若容器足夠大,以至于它可以從分割集中的第一個分割區(qū)開始,并在分割集中的最后一個分割區(qū)處(或以外)結(jié)束,則將它使用該方法放置(請參閱示例 2)。若容器不夠大,無法做到這一點,則它將在映射中定位為在分割集的最后一個分割區(qū)結(jié)束(請參閱示例 4。)這樣做是為了最小化需要重新平衡的數(shù)據(jù)量。
注:
在下列示例中,容器大小未將容器標(biāo)記計算在內(nèi)。容器大小很小,僅用于說明目的,它們不是建議的容器大小。這些示例顯示表空間中不同大小的容器,但建議使用相同大小的容器。
示例 1:
如果您創(chuàng)建的表空間有三個容器,擴展數(shù)據(jù)塊大小為 10,并且容器分別為 60、40 和 80 頁(6、4 和 8 個擴展數(shù)據(jù)塊),則將創(chuàng)建帶有映射的表空間,可進行如圖 88 中所示的圖解。
圖 88. 帶有三個容器和 18 個擴展數(shù)據(jù)塊的表空間
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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)
|
表空間映射中的標(biāo)題是“范圍編號”、“分割集”、“分割區(qū)偏移”、“根據(jù)范圍尋址的最大擴展數(shù)據(jù)塊編號”、“根據(jù)范圍尋址的最大頁編號”、“起始分割區(qū)”、“結(jié)束分割區(qū)”、“范圍調(diào)節(jié)”和“容器列表”。
示例 2:
如果在示例 1 中向表空間添加了一個 80 頁的容器,容器就大到足以從第一個分割區(qū)(分割區(qū) 0)中開始,并在最后一個分割區(qū)(分割區(qū) 7)中結(jié)束。它被定位為從第一個分割區(qū)中開始。結(jié)果表空間可進行如圖 89 中所示的圖解。
圖 89. 帶有四個容器和 26 個擴展數(shù)據(jù)塊的表空間
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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)
|
如果高水位標(biāo)記在擴展數(shù)據(jù)塊 14 以內(nèi),則重新平衡程序?qū)臄U展數(shù)據(jù)塊 0 開始,并且將把所有擴展數(shù)據(jù)塊上移至 14(包括 14)。兩個映射內(nèi)的擴展數(shù)據(jù)塊 0 的位置相同,所以不必移動此擴展數(shù)據(jù)塊。擴展數(shù)據(jù)塊 1 和 2 的情況相同。需要移動擴展數(shù)據(jù)塊 3,所以從舊位置(容器 0 內(nèi)的第二個擴展數(shù)據(jù)塊)讀取該擴展數(shù)據(jù)塊并寫至新位置(容器 3 內(nèi)的第一個擴展數(shù)據(jù)塊)。將移動此擴展數(shù)據(jù)塊之后直到擴展數(shù)據(jù)塊 14(包括擴展數(shù)據(jù)塊 14)的每個擴展數(shù)據(jù)塊。一旦移動了擴展數(shù)據(jù)塊 14,當(dāng)前映射看起來會像新映射,并且重新平衡程序?qū)⒔K止。
如果改變映射以使所有新添加的空間都在上限之后,則不需要重新平衡并且所有的空間都立即可用。如果改變映射以使部分空間在高水位標(biāo)記之后,則分割區(qū)中在高水位標(biāo)記之上的空間將是可用的。余下部分直到重新平衡完成才可用。
如果決定擴展容器,則重新平衡程序的功能相似。如果擴展容器以使它超出了分割集中的最后一個分割,則將擴展該分割集以適應(yīng)這種情況并將相應(yīng)地移出其后的分割集。結(jié)果是容器不會擴展到其后的任何分割集中。
示例 3:
以“示例 1”中的表空間為例。如果將容器 1 從 40 頁擴展到 80 頁,則新表空間將類似圖 90。
圖 90. 帶有三個容器和 22 個擴展數(shù)據(jù)塊的表空間
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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 個擴展數(shù)據(jù)塊)的容器,則將以如下方式將該容器添加至新映射。容器大小不足以從第一個分割區(qū)(分割區(qū) 0)中開始,并在最后一個分割區(qū)(分割區(qū) 7)處或以外結(jié)束,因此將它定位為在最后一個分割區(qū)中結(jié)束。(請參閱圖 91。)
圖 91. 帶有四個容器和 23 個擴展數(shù)據(jù)塊的表空間
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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 選項。要添加容器并重新平衡數(shù)據(jù),在 ALTER TABLESPACE 語句上使用 ADD 選項。如果正在向已經(jīng)有多個分割集的表空間添加容器,則可以指定想要向哪個分割集添加容器。為此,在 ALTER TABLESPACE 語句上使用 ADD TO STRIPE SET 選項。如果不指定分割集,則缺省行為將是向當(dāng)前分割集添加容器。當(dāng)前分割集是最新創(chuàng)建的分割集,而不是最后向其添加空間的分割集。
對分割集的任何更改可能導(dǎo)致對該分割集及其后的任何其他分割集的重新平衡。
可以通過使用表空間快照來監(jiān)視重新平衡的進度。表空間快照可以提供關(guān)于重新平衡的信息,如重新平衡的開始時間、已經(jīng)移動了多少個擴展數(shù)據(jù)塊以及需要移動多少個擴展數(shù)據(jù)塊。
沒有重新平衡(使用分割集)
如果添加或擴展容器,并且添加的空間在表空間高水位標(biāo)記之上,則不會發(fā)生重新平衡。
添加容器將總是在高水位標(biāo)記下添加空間。換句話說,添加容器時,重新平衡通常是必要的。有一個選項可強制將新容器添加到高水位標(biāo)記之上,它允許您選擇不對表空間的內(nèi)容重新平衡。此方法的一個優(yōu)點是新容器可立即使用。不進行重新平衡這一選項僅在添加容器時才適用,在擴展現(xiàn)有容器時不適用。擴展容器時,僅當(dāng)添加的空間在高水位標(biāo)記之上時,才能避免重新平衡。例如,如果有許多大小相同的容器,并且按相同的量擴展它們,則擴展數(shù)據(jù)塊的相對位置不會更改,并且不會發(fā)生重新平衡。
將容器添加到表空間中而不進行重新平衡可通過添加新的分割集來實現(xiàn)。分割集是表空間中的一組容器,數(shù)據(jù)在其上進行分割,且獨立于屬于該表空間的其他容器。現(xiàn)有分割集中的現(xiàn)有容器保持不變,而添加的容器成為新分割集的一部分。
要添加容器而不進行重新平衡,在 ALTER TABLESPACE 語句上使用 BEGIN NEW STRIPE SET 選項。
示例 5:
如果表空間有三個容器,擴展數(shù)據(jù)塊大小為 10,并且容器分別為 30、40 和 40 頁(分別為 3、4 和 4 個擴展數(shù)據(jù)塊),則表空間可進行如圖 92 中所示的圖解。
圖 92. 帶有三個容器和 11 個擴展數(shù)據(jù)塊的表空間
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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 個擴展數(shù)據(jù)塊)時,不會影響現(xiàn)有范圍;而是將創(chuàng)建一組新范圍。這一組新范圍是一個分割集,而最新創(chuàng)建的分割集稱為當(dāng)前分割集。添加了兩個新的容器之后,表空間將類似圖 93。
相應(yīng)的表空間映射,如表空間快照中所示,類似如下:
范圍 分割集 分割區(qū) 最大 最大 起始 結(jié)束 調(diào)節(jié) 容器
編號 偏移 擴展數(shù)據(jù)塊 頁 分割區(qū) 分割區(qū)
[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 子句配合使用,則將把容器添加至當(dāng)前分割集(最高分割集)。可以使用 ADD TO STRIPE SET 子句來將容器添加到表空間中的任何分割集。必須指定有效的分割集。
DB2 數(shù)據(jù)庫 Linux 版、UNIX 版和 Windows 版使用表空間映射來跟蹤分割集,并且添加新容器而不進行重新平衡通常將導(dǎo)致映射比對容器進行重新平衡時增長得快。當(dāng)表空間映射變得過大時,如果試圖添加更多容器,將接收到錯誤 SQL0259N。