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) 

 

你可能感兴趣的:(oracle,delete,truncate,休闲,高水位线)