`
awenhaowenchao
  • 浏览: 72115 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle中delete与trucate

阅读更多
转帖:
http://hi.baidu.com/victor036/blog/item/d14024432ef1b41c72f05dfb.html

oracle中delete与trucate的区别2010-10-20 13:45
1.准备数据与相关表
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;
2.查看新增加纪录的结果:
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; 结果为4352k

truncate table dengtaotest;
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'; SUM(BYTES)/1024 --------------- 128
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX'; SUM(BYTES)/1024 --------------- 128
不重用存贮区的截表,结果变了,缩回到了initial extents
[结论]
1、delete,表占用空间不变,这个众所周知,所谓的water-mark不变;表上索引占用空间也不会变;
2、truncate table tb_name reuse storage,表占用不变,表上索引占用也不会变;
3、truncate table tb_name,表与表上索引的空间占用均回到建立索引或表时的initial参数。
4、定期rebuild索引是一个好习惯,一是提高索引效率二是释放存贮区。
补充参数:

  TRUNCATE TABLE name [DROP/REUSE STORAGE]

  DROP STORAGE:显式指明释放数据表和索引的空间

  REUSE STORAGE:显式指明不释放数据表和索引的空间

Truncate table 表名 速度快,而且效率高,因为:

  TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

  DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

  TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

  对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

  TRUNCATE TABLE 不能用于参与了索引视图的表。

  对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS

分享到:
评论

相关推荐

    ORACLE-delete后的回复

    在Oracle数据库中,删除操作(DELETE)是不可逆的,一旦数据被删除,如果没有备份或者没有启用归档日志模式,通常无法直接恢复。但是,Oracle提供了一些高级特性,如闪回查询(Flashback Query)和闪回事务...

    sql恢复oracle数据库delete的数据

    在"恢复oracle数据库delete的数据.txt"文件中,可能会包含具体的恢复步骤、示例SQL语句和注意事项,建议仔细阅读以获取更详细的信息。记得在实际操作前进行充分的测试,以验证恢复策略的有效性。

    Oracle-DELETE删除记录sql语句用法.doc

    Oracle-DELETE删除记录sql语句用法.doc

    delete all delete all delete all delete all

    5. 缓存与历史记录:在浏览器中,"Delete All"可以清除浏览历史、cookies、缓存,以保护隐私或解决加载问题。 6. 网络存储:云服务或NAS设备上,"Delete All"可能用于删除整个文件夹或存储空间的内容,需谨慎操作,...

    ORACLE数据库误操作执行了DELETE,该如何恢复数据?

    误执行DELETE操作是Oracle数据库管理中常见的问题之一。通过了解当前SCN值、利用AS OF SCN查询数据以及使用Flashback Table功能,可以在很大程度上减少数据丢失的风险。然而,在实际操作中,还需要注意以下几个方面...

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    在 Oracle 数据库中,如果删除了大量数据(千万级别),可能会出现查询变慢的问题。下面我们将分析这个问题的原因,并提供解决方案。 问题的原因主要有两个方面: 1. 表空间的增长:当删除大量数据后,表空间可能...

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

    Delete 语句和 Truncate 语句是 Oracle 数据库中两种常用的删除数据的方法,但是它们之间存在着明显的差异。 一、Delete 语句 Delete 语句是一种 DML(Data Manipulation Language)语句,用于删除表中的数据。 ...

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

    为了应对这类问题,可以通过创建Oracle系统触发器来实现对`DROP TABLE`和`TRUNCATE TABLE`命令的监控与阻止。以下详细介绍两种不同的Oracle版本(10g和8i)下如何创建相应的系统触发器。 ### Oracle 10g环境下的...

    DatabaseHelper_oracle_c#Oracle_C#_ManagedDataAccess_oracle操作_

    在.NET开发环境中,使用C#语言与Oracle数据库进行交互是一种常见的需求。Oracle.ManagedDataAccess是Oracle公司提供的一个客户端库,专门用于C#等.NET语言的Oracle数据库连接和操作。这个库是完全托管的,无需依赖...

    Java_oracle_creat_inset_delete.rar_java 连接oracle_oracle_oracle 操

    1. **建立连接**:在Java程序中,我们通常使用`java.sql.DriverManager`类的`getConnection()`方法来建立与Oracle数据库的连接。例如: ```java import java.sql.Connection; import java.sql.DriverManager; ...

    Oracle中文教程(最经典教程)

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据主导地位。本“Oracle中文教程(最经典教程)”旨在为不同水平的学习者提供深入浅出的指导,帮助他们掌握Oracle数据库的核心概念、管理...

    oracle11g官方中文文档完整版

    Oracle 数据库 11g 中的分区.pdf Oracle 数据库 11g:可管理性概述.pdf Oracle 数据库 11g:新特性概述.pdf Oracle 真正应用集群 11g .pdf Oracle高级压缩.pdf Oracle性能优化包 11g .pdf Oracle真正应用测试...

    Oracle 10g入门与提高

    本资料“Oracle 10g入门与提高”是一份PPT教程,旨在帮助初学者掌握Oracle 10g的基础知识,并进一步提升其在实际操作中的技能。 一、Oracle 10g基础 Oracle 10g包含了许多关键特性,如数据仓库优化、网格计算支持、...

    oracle_Log_Delete.rar_oracle

    标题"oracle_Log_Delete.rar_oracle"和描述中的"日志自动清除,保证数据空间,加强数据库"都指向了Oracle数据库的日志管理,特别是日志的自动删除功能。这里我们将详细探讨Oracle数据库的日志类型、日志清除的重要性...

    delete-oracle.rar_oracle

    首先,Oracle数据库在Linux系统中通常以服务的形式运行,因此删除Oracle前,我们需要停止相关的服务。这可以通过运行`/etc/init.d/oracle停止`或使用`systemctl stop oracle`命令来实现,具体命令取决于你的Linux...

    Oracle 11g 官方中文文档集萃【完整版】

    Oracle 数据库 11g 中的分区.pdf Oracle 数据库 11g:可管理性概述.pdf Oracle 数据库 11g:新特性概述.pdf Oracle 真正应用集群 11g .pdf Oracle高级压缩.pdf Oracle性能优化包 11g .pdf Oracle真正应用测试....

    Oracle学习资源与使用

    Oracle用户可以拥有不同的权限,例如CREATE、DROP、SELECT、INSERT、UPDATE和DELETE等。权限可以通过GRANT语句授予,也可以通过REVOKE语句撤销。 角色 Oracle角色是一种权限集合,用于简化权限管理。角色可以包含...

    oracle中文手册合集(8个CHM)

    1. **Ora9iSQL参考手册.chm** - 这部分主要针对Oracle 9i版本的SQL语法和特性,包括数据查询、数据操纵(INSERT、UPDATE、DELETE)、事务处理、索引、视图、存储过程和触发器等。它深入讲解了SQL在Oracle环境中的...

    Oracle11g中文文档

    3. **SQL语言**:Oracle11g支持标准SQL语句,如SELECT、INSERT、UPDATE、DELETE用于数据查询、插入、修改和删除。此外,还有DDL(Data Definition Language)用于创建和管理数据库对象,DML(Data Manipulation ...

Global site tag (gtag.js) - Google Analytics