oracle 高水位線的一些知識
學習oracle已經有一段時間了,現在把一些知識點寫出來,方便以後自己再複習。
The high water mark is the boundary between used and unused space in a segment(高水位線是段中已用和未用空間的邊界)。
--下面通過做一個實驗來驗證高水位線:
SQL> create user hwmuser identified by hwmuser; #創建hwmuser用戶
SQL> create tablespace hwmt datafile '/u01/app/oracle/oradata/jacky/hwm01.dbf' size 100m; #創建表空間hwmt
SQL> alter user hwmuser default tablespace hwmt;#設置hwmuser的默認表空間爲hwmt
SQL> grant dba to hwmuser;#給hwmuser用戶授權
SQL> conn hwmuser/hwmuser; #連接hwmuser
--以上都是準備工作,下面正式進入高水位線的實驗
SQL> create table hwmtest as select * from dba_objects where 2=3;#建表hwmtest
SQL> select segment_name,segment_type,blocks,extents from user_segments where segment_name='HWMTEST'; #查看錶中分配塊和區的大小
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
--------------------------------------------------------------------------------- ------------------ ---------- ----------
HWMTEST TABLE 8 1
SQL> analyze table hwmtest estimate statistics; #分析表hwmtest
Table analyzed.
--下面一條命令即是查詢表的高水位線:
SQL> select num_rows,blocks,empty_blocks from user_tables where table_name='HWMTEST'; #查表hwmtest的高水位線 blocks--已佔用的數據塊數(高水位線),empty_blocks--空閒的數據塊數
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 0 8
--表hwmtest無數據,所以表的高水位線就是零,下面插入數據:
SQL> insert into hwmtest select * from dba_objects;#向表hwmtest插入數據
50354 rows created.
SQL> commit;
Commit complete.
--再次分析表
SQL> analyze table hwmtest estimate statistics;
Table analyzed.
--再次查看錶中塊,區的分配情況
SQL> select segment_name,segment_type,blocks,extents from user_segments where segment_name='HWMTEST';
SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS
--------------------------------------------------------------------------------- ------------------ ---------- ----------
HWMTEST TABLE 768 21
此時oracle已經給表hwmtest分配了768個數據塊,21個區
--再次查看錶hwmtest的高水位線
SQL> select num_rows,blocks,empty_blocks from user_tables where table_name='HWMTEST';
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
52980 748 20
blocks(高水位)已經增長到了748,empty_blocks(空閒塊)還有20 ,748+20=768
--下面步驟爲刪除表的數據後再次查看高水位
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
20121017 09:56:07
SQL> alter table hwmtest enable row movement;
Table altered.
SQL> delete from hwmtest;
50354 rows deleted.
SQL> commit;
Commit complete.
SQL> analyze table hwmtest estimate statistics;
Table analyzed.
SQL> select num_rows,blocks,empty_blocks from user_tables where table_name='HWMTEST';
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 748 20
此時發現高水位並未減少,說明delete只是刪除表中數據塊的記錄,但不會使水位下降,當對錶再次查詢時可能還是很慢,進行全表掃描的時候,高水位線下的數據都會進行掃描。
--下面用trncate命令來刪除表的數據,並對高水位進行查詢
SQL> flashback table hwmtest to timestamp to_date('20121017 09:56:07','yyyymmdd hh24:mi:ss');
Flashback complete.
SQL> select count(*) from hwmtest;
COUNT(*)
----------
50354
SQL> truncate table hwmtest;
Table truncated.
SQL> analyze table hwmtest estimate statistics;
Table analyzed.
SQL> select num_rows,blocks,empty_blocks from user_tables where table_name='HWMTEST';
NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 0 8
現在高水位已經回到零了。