Oracle 中truncate和delete的区别

Oracle 中truncate和delete的区别,第1张

TRUNCATE

TABLE

在功能上与不带

WHERE

子句的

DELETE

语句相同:二者均删除表中的全部行。但

TRUNCATE

TABLE

DELETE

速度快,且使用的系统和事务日志资源少。

DELETE

语句每次删除一行,并在事务日志中为所删除的每行记录一项。

TRUNCATE

TABLE

通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE,DELETE,DROP放在一起比较:

TRUNCATE

TABLE:删除内容、释放空间但不删除定义。

DELETE

TABLE:删除内容不删除定义,不释放空间。

DROP

TABLE:删除内容和定义,释放空间。

当然可以使用,

truncate用于清空表数据有奇效,飞快,适用于数据量大,需要全部删除的数据,不用保留数据占用的数据空间,

delete删除时会保留数据临时空间,所以相对会慢一点。

当你确定数据部需要时用truncate更好,更快

你可以试试PRM for Oracle。

ParnassusData Recovery Manager(以下简称PRM)是企业级ORACLE数据灾难恢复软件,可直接从Oracle9i,10g,11g,12c的数据库数据文件(datafile)中抽取还原数据表上的数据,而不需要通过ORACLE数据库实例上执行SQL来拯救数据。ParnassusDataRecovery Manager是一款基于JAVA开发的绿色软件,无需安装,下载解压后便可直接使用。

恢复场景1 误Truncate表的常规恢复

D公司的业务维护人员由于误将产品数据库当做测试环境库导致错误地TRUNCATE了一张表上的所有数据,DBA尝试恢复但是发觉最近的备份不可用,导致无法从备份中恢复出该数据表上的记录。 此时DBA决定采用PRM来恢复已经被TRUNCATE掉的数据。

由于该环境中 所有数据库文件均是可用且健康的,用户仅需要 字典模式下加载SYSTEM表空间的数据文件以及被TRUNCATED表的数据文件即可,例如:

create table ParnassusDatatorderdetail_his1 tablespace users as

select from parnassusdatatorderdetail_his;

SQL> desc ParnassusDataTORDERDETAIL_HIS

Name                    Null    Type

----------------------- -------- --------------

SEQ_ID                NOT NULL   NUMBER(10)

SI_STATUS                        NUMBER(38)

D_CREATEDATE                     CHAR(20)

D_UPDATEDATE                     CHAR(20)

B_ISDELETE                       CHAR(1)

N_SHOPID                         NUMBER(10)

N_ORDERID                        NUMBER(10)

C_ORDERCODE                      CHAR(20)

N_MEMBERID                       NUMBER(10)

N_SKUID                          NUMBER(10)

C_PROMOTION                      NVARCHAR2(5)

N_AMOUNT                         NUMBER(7,2)

N_UNITPRICE                      NUMBER(7,2)

N_UNITSELLINGPRICE               NUMBER(7,2)

N_QTY                            NUMBER(7,2)

N_QTYFREE                        NUMBER(7,2)

N_POINTSGET                      NUMBER(7,2)

N_OPERATOR                       NUMBER(10)

C_TIMESTAMP                      VARCHAR2(20)

H_SEQID                          NUMBER(10)

N_RETQTY                         NUMBER(7,2)

N_QTYPOS                         NUMBER(7,2)

select count() from ParnassusDataTORDERDETAIL_HIS;

COUNT()

----------

984359

select bytes/1024/1024 from dba_segments where segment_name='TORDERDETAIL_HIS' and owner='PARNASSUSDATA';

BYTES/1024/1024

---------------

18971875

SQL> truncate table ParnassusDataTORDERDETAIL_HIS;

Table truncated

SQL> select count() from ParnassusDataTORDERDETAIL_HIS;

COUNT()

----------

0

启动PRM ,并选择 Tools =>  Recovery Wizard

点击Next

在此TRUNCATE场景中并未采用ASM存储,所以仅需要选择 《Dictionary Mode》字典模式即可:

Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行)。

删除某一行:

Delete from 数据表名称 where 列名称=值;

删除所有行:

Delete  from 数据表名称

Truncate:删除数据表中的数据(仅数据表中的数据,不删除表)。

truncate table 数据表名称

TRUNCATE TABLE语句是一种快速、无日志记录的方法。TRUNCATE TABLE语句与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE语句速度更快,并且使用更少的系统资源和事务日志资源。

删除数据的速度,一般来说: drop> truncate > delete

与 DELETE 语句相比,TRUNCATE TABLE语句具有以下优点:

所用的事务日志空间较少。

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

使用的锁通常较少。

当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。

如无例外,在表中不会留有任何页。

执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除 *** 作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除 *** 作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

与 DELETE 语句相同,使用 TRUNCATE TABLE语句清空的表的定义与其索引和其他关联对象一起保留在数据库中。

你可以试试PRM for Oracle。

ParnassusData Recovery Manager(以下简称PRM)是企业级ORACLE数据灾难恢复软件,可直接从Oracle9i,10g,11g,12c的数据库数据文件(datafile)中抽取还原数据表上的数据,而不需要通过ORACLE数据库实例上执行SQL来拯救数据。ParnassusDataRecovery Manager是一款基于JAVA开发的绿色软件,无需安装,下载解压后便可直接使用。

恢复场景1 误Truncate表的常规恢复

D公司的业务维护人员由于误将产品数据库当做测试环境库导致错误地TRUNCATE了一张表上的所有数据,DBA尝试恢复但是发觉最近的备份不可用,导致无法从备份中恢复出该数据表上的记录。 此时DBA决定采用PRM来恢复已经被TRUNCATE掉的数据。

由于该环境中 所有数据库文件均是可用且健康的,用户仅需要 字典模式下加载SYSTEM表空间的数据文件以及被TRUNCATED表的数据文件即可,例如:

create table ParnassusDatatorderdetail_his1 tablespace users as

select from parnassusdatatorderdetail_his;

SQL> desc ParnassusDataTORDERDETAIL_HIS

Name Null Type

----------------------- -------- --------------

SEQ_ID NOT NULL NUMBER(10)

SI_STATUS NUMBER(38)

D_CREATEDATE CHAR(20)

D_UPDATEDATE CHAR(20)

B_ISDELETE CHAR(1)

N_SHOPID NUMBER(10)

N_ORDERID NUMBER(10)

C_ORDERCODE CHAR(20)

N_MEMBERID NUMBER(10)

N_SKUID NUMBER(10)

C_PROMOTION NVARCHAR2(5)

N_AMOUNT NUMBER(7,2)

N_UNITPRICE NUMBER(7,2)

N_UNITSELLINGPRICE NUMBER(7,2)

N_QTY NUMBER(7,2)

N_QTYFREE NUMBER(7,2)

N_POINTSGET NUMBER(7,2)

N_OPERATOR NUMBER(10)

C_TIMESTAMP VARCHAR2(20)

H_SEQID NUMBER(10)

N_RETQTY NUMBER(7,2)

N_QTYPOS NUMBER(7,2)

select count() from ParnassusDataTORDERDETAIL_HIS;

COUNT()

----------

984359

select bytes/1024/1024 from dba_segments where segment_name='TORDERDETAIL_HIS' and owner='PARNASSUSDATA';

BYTES/1024/1024

---------------

18971875

SQL> truncate table ParnassusDataTORDERDETAIL_HIS;

Table truncated

SQL> select count() from ParnassusDataTORDERDETAIL_HIS;

COUNT()

----------

0

启动PRM ,并选择 Tools => Recovery Wizard

点击Next

在此TRUNCATE场景中并未采用ASM存储,所以仅需要选择 《Dictionary Mode》字典模式即可:

以上就是关于Oracle 中truncate和delete的区别全部的内容,包括:Oracle 中truncate和delete的区别、oracle函数中不能用 truncate table语句吗、我们公司一个oracle数据库里的一张表被truncate了,现在要想办法恢复,没有开归档也没有备等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10187827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存