`

truncate table会不会释放相关索引

 
阅读更多

drop   table dt_test_tab;
create table dt_test_tab (i number);
create index dt_test_idx on dt_test_tab(i);
insert into  dt_test_tab values (1);
insert into  dt_test_tab select i from dt_test_tab; / ... / 共17次得到131072条记录
commit;

 

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 结果为4352k
truncate table dt_test_tab;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 结果为128k(就是建表建索引时缺省的initial extent,看来是缩回去了)
alter index dt_test_idx rebuild;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 结果还是128K. 想缩到0, 没门儿

 


再试试表,索引,delete/truncate reuse|drop storage 的结果:

 


select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB'; 表大小为:3328K (比索引还小,特例,因为表只一个字段)
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 索引大小为:4352K

 


删掉一半数据:
delete dt_test_tab where rownum < 65536; select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';
表大小未变:3328K 注意此时还没有commit;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 索引大小未变:4352K
commit;

 

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB'; 删掉一半记录后表大小未变:3328K
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 删掉一半记录后索引大小未变:4352K [删了记录,index 也未释放]
alter index dt_test_idx rebuild;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 删掉一半记录后重建索引,索引大小为:2200K [重建索引后,有所释放]

 

 

truncate table dt_test_tab reuse storage;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB'; 重用存贮区的截表,表大小不变:3328K
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 重用存贮区的截表,索引大小同样未变:2200K

 

 

truncate table dt_test_tab;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';不重用存贮区的截表,结果变了,缩回到了initial extents

 

结论]1、delete,表占用空间不变,这个众所周知,所谓的water-mark不变;表上索引占用空间也不会变;
      2、truncate table tb_name reuse storage,表占用不变,表上索引占用也不会变;
      3、truncate table tb_name,表与表上索引的空间占用均回到建立索引或表时的initial参数。
      4、定期rebuild索引是一个好习惯,一是提高索引效率二是释放存贮区。
——小实验结束,立此存照。

分享到:
评论

相关推荐

    Truncate Table的用法讲解

    `DELETE` 会为每行删除操作创建日志条目,而 `TRUNCATE TABLE` 只记录页面的释放。 3. **标识列**:如果表中有标识列(自增列),`TRUNCATE TABLE` 会重置该列的种子值,即下一行的标识值会从初始值开始重新计算。若...

    PostgreSQL TRUNCATE TABLE

    当你需要清空一张表,而又不想破坏表的定义或索引等元数据时,`TRUNCATE TABLE` 是理想的选择。与 `DROP TABLE` 相比,`DROP TABLE` 会完全删除表及其结构,这意味着如果你想再次使用该表,需要重新创建表结构和填充...

    TRUNCATE与 DELETE区别

    首先,TRUNCATE TABLE 是一种快速删除表中所有数据的方式,它并不记录每行的删除操作,而是直接释放存储数据的页面。这意味着,当使用 TRUNCATE 时,事务日志空间的使用量非常小,这对于大型表尤其有利。相比之下,...

    数据库中truncate,delete,drop语句的比较

    - 可以重用存储空间,即如果执行`TRUNCATE TABLE table_name REUSE STORAGE`,则可以释放未使用的空间并允许再次使用。 2. **`DELETE`**: - **定义**:`DELETE`是一种DML(数据操纵语言)命令,用于删除表中的...

    SQL Server误区30日谈 第19天 Truncate表的操作不会被记录到日志

    相反,它会释放构成表的数据页,这是一个批量的、不可回滚的操作。由于不涉及行级别的删除,Truncate Table通常比DELETE更快,因为它不需要为每一行记录事务日志条目。 在SQL Server中,Truncate Table的操作是通过...

    truncate 功能开发文档1

    4. 即使数据或索引文件损坏,只要表定义文件合法,仍可使用`TRUNCATE TABLE`将表恢复为空。 在Cedar中,`TRUNCATE TABLE`语法支持一次性清空多张表,成功执行后返回“0 rows affected”,失败则返回错误代码。然而...

    delete from 表名与truncate table 表名区别

    此外,如果表包含临时或全局索引,`TRUNCATE TABLE` 可能会失败,而 `DELETE FROM` 则没有这个问题。 6. 空间回收 `TRUNCATE TABLE` 立即释放表空间,而 `DELETE FROM` 在事务提交后才会回收。这使得 `TRUNCATE` ...

    truncate,delete以及drop区别汇总

    - **空间完全释放**:`drop` 操作会释放表所占用的所有空间。 - **速度较快**:与 `truncate` 类似,`drop` 的执行速度也很快。 - **安全性**:使用 `drop` 需要格外小心,尤其是在没有备份的情况下使用。 **3. ...

    SQL中Truncate的用法

    本文导读:删除表中的数据的方法有delete,truncate, 其中TRUNCATE TABLE用于删除表中的所有行,而不记录单个行删除操作。TRUNCATE TABLE 与没有 WHERE 子句的 DELETE 语句类似;但是,TRUNCATE TABLE 速度更快,使用...

    分区索引,本地索引,全局索引的区别

    这是因为对于分区表的操作(如truncate、move或shrink)通常只会影响本地索引的一个分区,而不会影响全局索引的所有分区。 - **位图索引**:位图索引只能是本地分区索引。 ##### 2. 创建示例 以创建有前缀的本地...

    使用之MySQL官方文档翻译

    - **性能影响**:在使用较大 InnoDB 缓存池的系统中,由于 TRUNCATE TABLE 操作会移除 InnoDB 表的自适应哈希索引记录,可能会导致系统性能出现短暂下降。 #### 日志及复制影响 TRUNCATE TABLE 作为一种特殊的 DDL...

    利用 Oracle 系统触发器防止误删除表操作

    当DBA或其他用户具有足够的权限时,可能会因为输入错误等原因执行`DROP TABLE`或`TRUNCATE TABLE`命令,导致重要的数据表被意外删除或清空。例如,用户原本打算删除名为`A`的表(`DROP TABLE A CASCADE CONSTRAINTS;`...

    TRUNCATE 快速删除表中的所有数据

    `DELETE` 会在日志中为每一行删除操作创建记录,这可能导致事务日志迅速膨胀,而 `TRUNCATE TABLE` 只记录页面的释放,大大减少了日志使用。 其次,`TRUNCATE TABLE` 在锁的使用上也更为高效。`DELETE` 通常会锁定...

    oracle数据库删除数据Delete语句和Truncate语句的对比.docx

    其语法结构为`TRUNCATE [TABLE] table_name`。使用`TRUNCATE`删除数据时,不会产生回滚段,因此删除速度非常快。例如,`TRUNCATE TABLE users`将彻底清空`users`表。`TRUNCATE`语句有两种形式:一种是默认的,即删除...

    MySQL中truncate误操作后的数据恢复案例

    在MySQL数据库管理中,误操作是一个常见的问题,尤其是像`TRUNCATE TABLE`这样的命令,它会立即删除表中的所有数据且无法通过`ROLLBACK`撤销。本案例将详细讲解如何在MySQL中,特别是在Percona Server 5.6.16环境下...

    Truncate表恢复(无备份情况下)

    与`DELETE`不同的是,`TRUNCATE`不会逐一删除数据行,而是重置数据字典中的元数据信息,使表返回到初始状态。这一操作虽然高效,但同时也带来了数据恢复的风险。本文将详细介绍在没有备份的情况下恢复`TRUNCATE`后...

    Access中的trucate语句

    这条命令会将"Article"表中的所有行删除,但不会影响表的结构或任何关联的索引和约束。然而,与真正的TRUNCATE语句相比,使用DELETE语句有其局限性。特别是当表中数据量非常大时,DELETE操作可能会相当耗时,并且会...

Global site tag (gtag.js) - Google Analytics