Oracle 高水位線的一點研究

531968912發表於2016-07-05
最近學習了一陣子Oracle, 感覺Oracle真的是博大精深, 包括Oralce記憶體結構,效能調整,資料備份等都不簡單, 這些對開發也很重要, 下面把做的Oracle高水位線的一些實驗貼出來, 方便以後Review: 
高水位線實驗: 
-- 建立test3表 
SQL> create table test3 as 
  2  select * from dba_objects where 1 = 2; 
Table created 
-- 檢視錶中分配塊,區大小 
SQL> SELECT segment_name, segment_type, blocks -- 分配資料塊數, extents -- 分配區塊數 
  2    FROM dba_segments 
  3   WHERE segment_name = 'TEST3' 
  4  ; 
SEGMENT_NAME                                                                     SEGMENT_TYPE           BLOCKS    EXTENTS 
-------------------------------------------------------------------------------- ------------------ ---------- ---------- 
TEST3                                                                            TABLE                       8          1 
TEST3                                                                            TABLE                       8          1 
-- 分析表TEST3表 
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS; 
Table analyzed 
-- 查詢TEST3表高水位線 
SQL> SELECT blocks -- 高水位線(佔用TEST3表資料塊數), empty_blocks -- TEST3表空閒塊數, num_rows 
  2    FROM user_tables 
  3   WHERE table_name = 'TEST3'; 
    BLOCKS EMPTY_BLOCKS   NUM_ROWS 
---------- ------------ ---------- 
         0            7          0 
-- 因為未向TEST3表中插入任何資料,因此此表的高水位線為0,現向TEST3表中插入資料再觀察 
SQL> insert into test3 
  2  select * from dba_objects; 
50361 rows inserted 
SQL> commit; 
Commit complete 
-- 重新分析表 
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS; 
Table analyzed 
-- 再次檢視錶中分配塊,區大小 
SQL> SELECT segment_name, segment_type, blocks, extents 
  2    FROM dba_segments 
  3   WHERE segment_name = 'TEST3' 
  4  ; 
SEGMENT_NAME                                                                     SEGMENT_TYPE           BLOCKS    EXTENTS 
-------------------------------------------------------------------------------- ------------------ ---------- ---------- 
TEST3                                                                            TABLE                       8          1 
TEST3                                                                            TABLE                     768         21 
此時看到BLOCKS數已增長到768, 也就是Oracle分配給TEST3表768個資料塊,21個區 
-- 再次檢視TEST3表高水位線 
SQL> SELECT blocks, empty_blocks, num_rows 
  2    FROM user_tables 
  3   WHERE table_name = 'TEST3'; 
    BLOCKS EMPTY_BLOCKS   NUM_ROWS 
---------- ------------ ---------- 
       689           78      50361 
已增長到689個塊, 還有78個空閒塊,689 + 78 = 767, 比分配的少1個資料塊,是因為這一個資料塊是用作segment header 
-- 現將TEST3表delete,在檢視高水位線 
SQL> delete from test3; 
50361 rows deleted 
SQL> commit; 
Commit complete 
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS; 
Table analyzed 
SQL> 
SQL> SELECT blocks, empty_blocks, num_rows 
  2    FROM user_tables 
  3   WHERE table_name = 'TEST3'; 
    BLOCKS EMPTY_BLOCKS   NUM_ROWS 
---------- ------------ ---------- 
       689           78          0 
發現此表高水位線並未減少,證明delete只是刪除表中資料塊的記錄,但並不會使表中的高水位線下降, 在進行全表掃描時會Oracle會掃描表中高水位線下的所有資料塊, 
因此資料雖然被刪除了,但查詢時有可能還是很慢。所以在進行大表刪除時應使用truncate語句,看下面實驗: 
SQL> truncate table test3; 
Table truncated 
SQL> ANALYZE TABLE TEST3 ESTIMATE STATISTICS; 
Table analyzed 
SQL> 
SQL> SELECT blocks, empty_blocks, num_rows 
  2    FROM user_tables 
  3   WHERE table_name = 'TEST3'; 
    BLOCKS EMPTY_BLOCKS   NUM_ROWS 
---------- ------------ ---------- 
         0            7          0 
現在表中高水位下降到0了, 一點心得, 記錄下來。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2121534/,如需轉載,請註明出處,否則將追究法律責任。

相關文章