Oracle - 關於truncate 與 Delete的一點不同 (高水位線)

 查看一表所佔的block數目有多少,然後使用delete語句將表數據刪除,更新數據庫的統計信息,然後單看blocks,發現並沒有發生變化,這個就是意味着,數據沒有了,但是所佔的空間沒有返回來。

  1. SQL> select owner,table_name,tablespace_name,blocks from dba_tables where owner = 'SCOTT'
  2.  
  3. OWNER      TABLE_NAME TABLESPACE_NAME          BLOCKS 
  4. ---------- ---------- -------------------- ---------- 
  5. SCOTT      DEPT       USERS                         5 
  6. SCOTT      EMP        USERS                         5 
  7. SCOTT      BONUS      USERS                         0 
  8. SCOTT      SALGRADE   USERS                         5 
  9. SCOTT      TEST1      USERS                         0 
  10. SCOTT      TEST2      USERS                       687 
  11.  
  12. 已選擇6行。 
  13.  
  14. SQL> delete test2; 
  15.  
  16. 已刪除114688行。 
     
  17.  
  18. SQL> select owner,table_name,tablespace_name,blocks from dba_tables where owner = 'SCOTT'
  19.  
  20. OWNER      TABLE_NAME TABLESPACE_NAME          BLOCKS 
  21. ---------- ---------- -------------------- ---------- 
  22. SCOTT      DEPT       USERS                         5 
  23. SCOTT      EMP        USERS                         5 
  24. SCOTT      BONUS      USERS                         0 
  25. SCOTT      SALGRADE   USERS                         5 
  26. SCOTT      TEST1      USERS                         0 
  27. SCOTT      TEST2      USERS                       687 
  28.  
  29. 已選擇6行。 
  30.  
  31. SQL> select owner,table_name,tablespace_name,blocks from dba_tables where owner = 'SCOTT'
  32.  
  33. OWNER      TABLE_NAME TABLESPACE_NAME          BLOCKS 
  34. ---------- ---------- -------------------- ---------- 
  35. SCOTT      DEPT       USERS                         5 
  36. SCOTT      EMP        USERS                         5 
  37. SCOTT      BONUS      USERS                         0 
  38. SCOTT      SALGRADE   USERS                         5 
  39. SCOTT      TEST1      USERS                         0 
  40. SCOTT      TEST2      USERS                       687 
  41.  
  42. 已選擇6行。 

那麼,我們在使用truncate對錶進行操作,效果會是什麼樣的:

 

  1. SQL> truncate table test2; 
  2.  
  3. 表被截斷。 
  4.  
  5. SQL> select owner,table_name,tablespace_name,blocks from dba_tables where owner = 'SCOTT'
  6.  
  7. OWNER      TABLE_NAME TABLESPACE_NAME          BLOCKS 
  8. ---------- ---------- -------------------- ---------- 
  9. SCOTT      DEPT       USERS                         5 
  10. SCOTT      EMP        USERS                         5 
  11. SCOTT      BONUS      USERS                         0 
  12. SCOTT      SALGRADE   USERS                         5 
  13. SCOTT      TEST1      USERS                         0 
  14. SCOTT      TEST2      USERS                       687 
  15.  
  16. 已選擇6行。 
  17.  
  18. SQL> select owner,table_name,tablespace_name,blocks from dba_tables where owner = 'SCOTT'
  19.  
  20. OWNER      TABLE_NAME TABLESPACE_NAME          BLOCKS 
  21. ---------- ---------- -------------------- ---------- 
  22. SCOTT      DEPT       USERS                         5 
  23. SCOTT      EMP        USERS                         5 
  24. SCOTT      BONUS      USERS                         0 
  25. SCOTT      SALGRADE   USERS                         5 
  26. SCOTT      TEST1      USERS                         0 
  27. SCOTT      TEST2      USERS                         0 
  28.  
  29. 已選擇6行。 
  30.  
  31. SQL> 

同樣的,在使用了truncate後,更新數據庫的統計信息,發現所佔空間爲0,說明高水位線降下來了。

 

Note:添加以下如何對數據庫進行統計信息的更新。

  1. SQL> ANALYZE TABLE scott.test2 ESTIMATE STATISTICS
  2. SQL> execute dbms_stats.GATHER_SCHEMA_STATS('SCOTT',DBMS_STATS.AUTO_SAMPLE_SIZE) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章