oracle high water mark

 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
現在高水位已經回到零了。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章