授予或撤銷碎片的權(quán)限 如果您希望授予有用的碎片權(quán)限,您必須有一種戰(zhàn)略來控制數(shù)據(jù)分布。一種有效的戰(zhàn)略是按表達(dá)式來將數(shù)據(jù)記錄碎片化。但是,round-robin 數(shù)據(jù)記錄分布戰(zhàn)略沒有用,因?yàn)槊總€(gè)新數(shù)據(jù)記錄都會(huì)被添加到下一個(gè)碎片中。round-robin 分布會(huì)清空任何
授予或撤銷碎片的權(quán)限
如果您希望授予有用的碎片權(quán)限,您必須有一種戰(zhàn)略來控制數(shù)據(jù)分布。一種有效的戰(zhàn)略是按表達(dá)式來將數(shù)據(jù)記錄碎片化。但是,round-robin 數(shù)據(jù)記錄分布戰(zhàn)略沒有用,因?yàn)槊總€(gè)新數(shù)據(jù)記錄都會(huì)被添加到下一個(gè)碎片中。round-robin 分布會(huì)清空任何跟蹤數(shù)據(jù)分布的任何干凈方法,進(jìn)而消除對(duì)碎片授權(quán)的真正使用。出于基于表達(dá)式分布和 round-robin 分布之間的這一區(qū)別,GRANT FRAGMENT 和 REVOKE FRAGMENT 語句僅適用于具有基于表達(dá)式碎片的表。
當(dāng)創(chuàng)建碎片表時(shí),不存在默認(rèn)的碎片授權(quán)。使用 GRANT FRAGMENT 語句在一個(gè)或多個(gè)碎片上授予插入、更新和刪除權(quán)限。如果希望同時(shí)授予所有 3 種權(quán)限,可使用 GRANT FRAGMENT 語句的 ALL 關(guān)鍵字。請(qǐng)記住,不能僅通過命名包含碎片的表來授予碎片權(quán)限。您必須命名特定的語句。
當(dāng)您希望撤銷插入、更新或刪除權(quán)限時(shí),可以使用 REVOKE FRAGMENT 語句。此語句會(huì)撤銷一個(gè)或多個(gè)用戶針對(duì)碎片表的一個(gè)或多個(gè)碎片的權(quán)限。如果希望撤銷一個(gè)表中當(dāng)前存在的所有權(quán)限,可使用 ALL 關(guān)鍵字。如果不在命令中指定任何碎片,撤銷的權(quán)限將適用于表中當(dāng)前擁有該權(quán)限的所有碎片。
附加或分離碎片
您可以使用 ALTER FRAGMENT ATTACH 和 DETACH 語句來執(zhí)行碎片操作。ALTER FRAGMENT ATTACH 提供了一種方式來組合兩個(gè)未碎片化的表或向碎片表中添加碎片。ALTER FRAGMENT DETACH 提供了一種方式來刪除一個(gè)碎片表的碎片。
ATTACH
使用 ALTER FRAGMENT ON TABLE 語句的 ATTACH 子句來將具有相同結(jié)構(gòu)的表組合到一個(gè)碎片戰(zhàn)略中。該子句還提供了一種方式,通過利用碎片技術(shù)來將大量數(shù)據(jù)增量地加載到一個(gè)現(xiàn)有的表中。
您附加的任何表都必須已在獨(dú)立的分區(qū)中創(chuàng)建。不能多次附加同一個(gè)表。ATTACH 子句中列出的所有使用表必須具有與幸存的表相同的結(jié)構(gòu)。列的數(shù)量、名稱、數(shù)據(jù)類型和相對(duì)位置必須相同。
用戶定義的例程以及對(duì)一個(gè) ROW 類型列的字段的引用是無效的。不能將一個(gè)碎片表附加到另一個(gè)碎片表。
所有存儲(chǔ)碎片的 dbspace 都必須具有相同的頁面大小。
在兩個(gè)未碎片化的表上執(zhí)行 ATTACH 操作不能生成一個(gè)按間隔或按列表碎片化的幸存表。(如果希望附加兩個(gè)未碎片化的表,您可使用 ALTER FRAGMENT 語句的 INIT 選項(xiàng)來為一個(gè)未碎片化的表定義中間隔或列表碎片模式,然后使用 ATTACH 選項(xiàng)將第二個(gè)表附加到它。)
對(duì)于按間隔碎片化的幸存表,具有以下限制:
- 因?yàn)榇_定了碎片的順序位置,所以 BEFORE 和 AFTER 規(guī)范無效。
- 不能附加其表達(dá)式與現(xiàn)有的間隔碎片表達(dá)式相匹配的碎片。
- 在附加超過過渡值的碎片時(shí),正附加碎片的上限必須與一個(gè)間隔碎片邊界保持一致。也就是說,碎片的上限必須等于過渡值加上間隔值的一個(gè)整數(shù)倍數(shù)。
對(duì)于由安全策略保護(hù)的碎片表,如果未滿足任何以下條件,將一個(gè)碎片附加到該表的操作將會(huì)失敗:
- 源表和目標(biāo)包都受相同的安全策略保護(hù)。
- 兩個(gè)表都具有相同的保護(hù)粒度(行級(jí)、列級(jí)或同時(shí)包含行級(jí)和列級(jí))。
- 在兩個(gè)表中,同一組受保護(hù)的列受到了相同安全標(biāo)簽的保護(hù)。如果有多個(gè)受保護(hù)的列,可能每個(gè)表中有多個(gè)安全標(biāo)簽,但同一個(gè)標(biāo)簽必須保護(hù)兩個(gè)表中的同一列。
如果由于未滿足一個(gè)或多個(gè)上述條件,導(dǎo)致 ATTACH 操作失敗,可以使用 ALTER TABLE 語句使兩個(gè)表的模式相等,然后在修改的表上再次執(zhí)行 FRAGMENT ATTACH 語句。
當(dāng)將具有相同表結(jié)構(gòu)的表轉(zhuǎn)換為一個(gè)表中的碎片時(shí),您允許數(shù)據(jù)庫服務(wù)器管理碎片,而不是允許應(yīng)用程序來管理碎片。分布模式可以是 round-robin 或基于表達(dá)式。
要從兩個(gè)或多個(gè)結(jié)構(gòu)相同的未碎片化表中創(chuàng)建一個(gè)碎片表,ATTACH 子句必須在附加列表中包含幸存表。附加列表是 ATTACH 子句中的一個(gè)表列表。
要在新創(chuàng)建的單個(gè)碎片表中包含 rowid 列,可首先附加所有表,然后使用 ALTER TABLE 語句添加 rowid。
將一個(gè)表附加到一個(gè)碎片表
要將一個(gè)未碎片化的表附加到一個(gè)已碎片化的表,未碎片化的表必須已在一個(gè)獨(dú)立的 dbspace 中創(chuàng)建,并且必須具有與碎片表相同的表結(jié)構(gòu)。
當(dāng)將一個(gè)或多個(gè)表附加到一個(gè)碎片表時(shí),consumed_table 必須是未碎片化的。
在 ATTACH 操作中使用 ONLINE 關(guān)鍵字。
ONLINE 關(guān)鍵字要求數(shù)據(jù)庫服務(wù)器在內(nèi)部提交 ALTER FRAGMENT ATTACH 工作(如果沒有錯(cuò)誤),以及向幸存表應(yīng)用一個(gè)意向獨(dú)占鎖,而不是獨(dú)占鎖。獨(dú)占鎖適用于使用表,這些表必須是未碎片化的表。
執(zhí)行 ATTACH 后的索引
幸存表上分離的索引會(huì)保留相同的碎片戰(zhàn)略。也就是說,分離的索引不會(huì)自動(dòng)調(diào)整來適應(yīng)幸存表的新碎片。
在支持事務(wù)日志的數(shù)據(jù)庫中,ATTACH 操作會(huì)依據(jù)幸存表的新碎片戰(zhàn)略擴(kuò)展幸存表上的任何附加索引。使用表的所有行將采用這些自動(dòng)調(diào)整的索引。
在 IBM Informix 的無日志記錄的數(shù)據(jù)庫中,ATTACH 操作不會(huì)依據(jù)幸存表上的新碎片戰(zhàn)略來擴(kuò)展幸存表上的索引。要依據(jù)幸存表上的新碎片戰(zhàn)略來擴(kuò)展一個(gè)附加索引的碎片戰(zhàn)略,必須丟棄該索引并在幸存表上重新創(chuàng)建它。
一些 ALTER FRAGMENT … ATTACH 操作可能導(dǎo)致數(shù)據(jù)庫服務(wù)器更新索引結(jié)構(gòu)。當(dāng)在這些情況下重新構(gòu)建一個(gè)索引時(shí),關(guān)聯(lián)的列分布會(huì)自動(dòng)重新計(jì)算,并且該索引可供查詢優(yōu)化器在為附加了碎片的表設(shè)計(jì)查詢計(jì)劃時(shí)使用。
對(duì)于 ALTER FRAGMENT … ATTACH 自動(dòng)為其重建了 B 型樹索引的一個(gè)(或一組)索引列,重新計(jì)算的列分布統(tǒng)計(jì)信息等同于 HIGH 模式下由 UPDATE STATISTICS 語句所創(chuàng)建的分布。
如果重新構(gòu)建的索引不是 B 型樹索引,自動(dòng)重新計(jì)算的統(tǒng)計(jì)信息將對(duì)應(yīng)于 LOW 模式下由 UPDATE STATISTICS 語句所創(chuàng)建的分布。