当前位置:  数据库>oracle

delete与truncate清空表数据对HWM的影响

    来源: 互联网  发布时间:2017-05-06

    本文导语: 在Oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。 因为oralce有一个HWM高水位标记(或者说高水位线),它是oracle的一个表...

在Oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。

因为oralce有一个HWM高水位标记(或者说高水位线),它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出现使用 delete删除数据以后,查询的速度还是和delete以前一样。

因此我们可以得出delete 并不会释放表空间,要释放表空间,需要使用truncate语句。
下面我们在测试一下。
1)创建测试表并插入测试数据;
SQL> CREATE TABLE w.w AS SELECT * FROM dba_objects;


Table created.
2)查看表中分配块,区大小;
SQL> SELECT segment_name, segment_type, blocks, extents FROM dba_segments WHERE segment_name = 'W';   ------segment_name的值一定要大些

SEGMENT_NAME                                      SEGMENT_TYPE         BLOCKS    EXTENTS
--------------------------------------------------------------------------------- ------------------ ---------- ----------
W                                          TABLE            4264       49
blocks列为分配数据块儿数,extents列为分配区块儿数
3)分析表w;
SQL> ANALYZE TABLE w ESTIMATE STATISTICS;




Table analyzed.
4)查询表高水位线;
SQL> SELECT blocks, empty_blocks, num_rows FROM USER_TABLES WHERE TABLE_NAME = 'W';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
      4214         50     294935
blocks列为高水位线(占用w表数据块儿数),empty_blocks列为表w空闲块儿数
5)现在将w表delete,在查看高水位线 【Linux公社 http://www.linuxidc.com 】
SQL> DELETE FROM w;




290232 rows deleted.

SQL> commit;

Commit complete.

SQL> ANALYZE TABLE w ESTIMATE STATISTICS;

Table analyzed.

SQL> SELECT blocks, empty_blocks, num_rows FROM USER_TABLES WHERE TABLE_NAME = 'W';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
     4214         50      0                  ------高水位线并未下降,还是4214


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.awt类event的类成员方法: delete定义及介绍
  • C++中delete和delete[]的区别详细介绍
  • java命名空间javax.tools类simplejavafileobject的类成员方法: delete定义及介绍
  • C++中delete和delete[]的区别说明
  • java命名空间javax.tools接口fileobject的类成员方法: delete定义及介绍
  • 有关new和delete的问题
  • java命名空间javax.swing.event类tablemodelevent的类成员方法: delete定义及介绍
  • 是delete的问题还是系统问题
  • java命名空间javax.accessibility接口accessibletablemodelchange的类成员方法: delete定义及介绍
  • PHP PDO数据库类delete操作
  • java命名空间javax.accessibility接口accessibleeditabletext的类成员方法: delete定义及介绍
  • 用qt寫的程序中有很多new,為什麼不常看到delete?
  • java命名空间javax.swing类jspinner.accessiblejspinner的类成员方法: delete定义及介绍
  • 在CMP中怎样编写类似于Update,delete等操作命令
  • java命名空间javax.tools类forwardingfileobject<fextendsfileobject>的类成员方法: delete定义及介绍
  • 关于QT中的new和delete
  • java命名空间java.awt.event类keyevent的类成员方法: vk_delete定义及介绍
  • tar命令的-r和--delete子命令该如何使用啊?
  • java命名空间javax.swing.text类jtextcomponent.accessiblejtextcomponent的类成员方法: delete定义及介绍
  • linux 频繁new/delete 内存持续增长
  • java命名空间java.io类file的类成员方法: delete定义及介绍
  • MySQL防止delete命令删除数据的两种方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,