1. 程式人生 > >含LOB的表實際容量計算方法

含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的個人雜貨鋪