現在解釋下什麼是“高水位”:
oracle的邏輯儲存結構:資料表空間——>段——>區——> 塊
塊:是粒度最小的儲存單位,現在標準的塊大小是8K,ORACLE每一次I/O操作也是按塊來操作的,也就 是說當ORACLE從資料檔案讀資料時,是讀取多少個塊,而不是多少行.
區:由一系列相鄰的塊而組成,這也是ORACLE空間分配的基本單位,舉個例子來說,當我們建立一個表A 時,首先ORACLE會分配一區的空間給這個表,隨著不斷的INSERT資料到A,原來的這個區容不下插入的資料 時,ORACLE是以區為單位進行擴充的,也就是說再分配多少個區給A,而不是多少個塊.
段:是由一系列的區所組成,一般來說,當建立一個對象時(表,索引),就會分配一個段給這個對象.所 以從某種意義上來說,段就是某種特定的資料.如CREATE TABLE PM_USER,這個段就是資料區段,而CREATE INDEX ON PM_USER(NAME),ORACLE同樣會分配一個段給這個索引,但這是一個索引段了.查詢段的資訊可 以通過資料字典: SELECT * FROM USER_SEGMENTS來獲得,
資料表空間:包含段,區及塊.資料表空間的資料物理上儲存在其所在的資料檔案中.一個資料庫至少要有一個 資料表空間.
所有的oracle段都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,用來說明已經有多少沒有使用的資料區塊分配給這個segment。
HWM通常增長的幅度為一次5個資料區塊,原則上HWM只會增大,不會縮小,即使將表中的資料全部刪除 ,HWM還是為原值,由於這個特點,使 HWM很象一個水庫的曆史最高水位,這也就是HWM的原始含義,當 然不能說一個水庫沒水了,就說該水庫的曆史最高水位為0。但是如果我們在表上使用了 truncate命令 ,則該表的HWM會被重新置為0。
如何知道一個表的HWM?
a) 首先對錶進行分析:
ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;
b) 查看相關資訊:
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =<tablename>;
[SYS@orcl] SQL>select segment_name,segment_type,blocks from dba_segments where segment_name='A';
SEGMENT_NAME SEGMENT_TYPE BLOCKS
------------ ------------ -------
A TABLE 8
可得到A表分配了8個blocks。
[TEST1@orcl] SQL>analyze table a compute statistics;
表已分析。
[TEST1@orcl] SQL>select num_rows,blocks,empty_blocks from user_tables where table_name='A'
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
1 5 3
BLOCKS 列代表該表中曾經使用過得資料庫塊的數目,即水線。EMPTY_BLOCKS 代表分配給該表,但 是在水線以上的資料庫塊,即從來沒有使用的資料區塊.
[TEST1@orcl] SQL>delete from a;
[TEST1@orcl] SQL>analyze table a compute statistics;
表已分析。
[TEST1@orcl] SQL>select num_rows,blocks,empty_blocks from user_tables where table_name='A';
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 5 3
[TEST1@orcl] SQL>select count(distinct dbms_rowid.rowid_block_number(rowid)||
2 dbms_rowid.rowid_relative_fno(rowid)) "used" from a;
used
----------
0 註:Used = 0 這表名沒有任何資料庫塊容納資料,即表中無資料