含LOB的表實際容量計算方法
前兩天有一個開發庫,報了ORA-01654的錯誤,提示的是SYS_IL000…$$的物件不能分配表空間了,首先這種SYS_IL的物件名稱是系統預設為LOB大物件LOBINDEX設定的名稱,其次開發人員檢索dba_segments檢視看這個LOB所屬表的空間,似乎佔比一般。
這次涉及的問題,就是如何計算包含LOB物件的表空間實際容量的方法,之所以是說實際容量,是因為僅檢索表所佔空間,並不能反映LOB的容量。
這篇文章《How to Compute the Size of a Table containing Outline CLOBs and BLOBs (文件 ID 118531.1)》,就介紹了計算方法,接下來的實驗會以此為依據。
LOB是一種大物件型別,分為CLOB儲存字串型別,BLOB儲存二進位制型別。例如普通的VARCHAR2型別儲存的字串,容量不能超過4000位元組,因此若是超過了,則可以用CLOB儲存。LOB中的儲存很奇特,若是4000位元組以內,則和普通的VARCHAR2一樣,若超過則會儲存於和表不同的,一個特殊的LOB段中,並且會有一個INDEX段,因此簡單來看,一個包含LOB的表,可能包含表段、LOB段和LOB INDEX段三個segment物件。但dba_segments中表的容量不包含LOB段的容量(CLOB/BLOB),因此包含LOB的表實際容量為,
實驗:
1.建立測試表和資料
TEST_TABLE表包含了兩個CLOB列(超過4000位元組),INSERT了1000條記錄。
2.檢索user_segments檢視,
瞭解TEST_TABLE包含了五個段,一個TEST_TABLE表段,兩個LOBINDEX段,兩個LOBSEGMENT段,且計算所有段容量為12845056位元組。
3.檢索user_lobs檢視,
可知這兩個LOBSEGMENT段屬於具體的列。
4.使用文章中提供的指令碼,
dba_segments可以計算出表段容量。
dba_segments和dba_lobs聯合計算出LOBSEGMENT容量。
dba_segments和dba_indexes根據INDEX型別為LOB計算出LOBINDEX容量。
提供使用者名稱、表名引數,
容量為1284506,和(2)結果一致。
總結:
1.包含LOB物件的表,實際包含了表段、LOBSEGMENT和LOBINDEX三個物件型別,因此dba_segments僅檢索表段則不是實際容量。
2.根據LOB包含的物件型別,可以根據dba_segments、dba_lobs和dba_indexes來計算實際容量。
歡迎關注我的個人微信公眾號:bisal的個人雜貨鋪