oracle数据库删除数据Delete语句和Truncate语句的使用比较

oracle数据库删除数据Delete语句和Truncate语句的使用比较,第1张

当表中的数据不需要时 则应该删除该数据并释放所占用的空间 删除表中的数据可以使用Delete语句或者Truncate语句 下面分别介绍 一 delete语句 ( )有条件删除 语法格式 delete [from] table_name [where condition]; 如 删除users表中的userid为 的数据 delete from users where userid= ; ( )无条件删除整个表数据 语法格式 delete table_name; 如 删除user表中的所有数据 delete users ; 二 Truncate语句 使用Truncate语句是删除表中的所有记录 语法格式 Truncate [table] table_name; ( )删除所有记录不保留记录占用空间 Truncate [table] table_name [drop storage]; 如 删除users表中的所有数据并不保存占用空间 Truncate table users drop storage; 由于默认使用drop storage关键字 所以可以省略 drop storage; ( )删除所有记录保留记录占用空间 Truncate [table] table_name [reuse storage]; 如 删除users表中的所有数据并保存占用空间 Truncate table users reuse storage; 三 两种删除语句的对比 由于delete语句删除记录时候 记录是逐条删除的 而Truncate 语句删除数据时不产生回退信息 所以如果需要删除大量数据的时候使用delete则占用较多的系统资源 而如果使用Truncate 则会快的多 下面通过实例说明一下 首先建立user表 create table users ( userid varchar ( ) username varchar ( ) userpass varchar ( ) );复制代码 接着插入一条数据 insert into users values( GavinDream ); 使用复制插入方法插入几万条数据 insert into users(userid username userpass) select from users;我插入了 条数据 使用delete删除花费时间为 seconds 然后又插入了二倍的数据 但使用truncate花费时间仅仅为 seconds 如下图所示 lishixinzhi/Article/program/Oracle/201405/30860

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):

ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表

(2) WHERE子句中的连接顺序.:

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾

(3) SELECT子句中避免使用 ‘ ‘:

ORACLE在解析的过程中, 会将'' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

(4) 减少访问数据库的次数:

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;

(5) 在SQLPlus , SQLForms和ProC中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200

(6) 使用DECODE函数来减少处理时间:

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表

(7) 整合简单,无关联的数据库访问:

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

(8) 删除重复记录:

最高效的删除重复记录方法 ( 因为使用了ROWID)例子:

DELETE FROM EMP E WHERE EROWID > (SELECT MIN(XROWID)

FROM EMP X WHERE XEMP_NO = EEMP_NO);

(9) 用TRUNCATE替代DELETE:

当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息当命令运行后,数据不能被恢复因此很少的资源被调用,执行时间也会很短 (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)

(10) 尽量多使用COMMIT:

只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:

COMMIT所释放的资源:

a 回滚段上用于恢复数据的信息

b 被程序语句获得的锁

c redo log buffer 中的空间

d ORACLE为管理上述3种资源中的内部花费

(11) 用Where子句替换HAVING子句:

TRUNCATE

TABLE

删除表中的所有行,而不记录单个行删除 *** 作。

语法

TRUNCATE

TABLE

name

参数

name

是要截断的表的名称或要删除其全部行的表的名称。

注释

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

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

示例

下例删除

authors

表中的所有数据。

TRUNCATE

TABLE

authors

权限

TRUNCATE

TABLE权限默认授予表所有者、sysadmin固定服务器角色成员、db_owner

db_ddladmin

固定数据库角色成员且不可转让。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:Oracle给用户授权truncatetable的实现方案delete

from

表名与truncate

table

表名区别SQL中Truncate的用法golang实战之truncate日志文件详解tftruncated_normal与tfrandom_normal的详细用法smarty中改进truncate使其支持中文的方法SQL

Server中TRUNCATE事务回滚 *** 作方法实例理解SQL中truncate和delete的区别详解SQL中drop、delete和truncate的异同Mysql开启慢SQL并分析原因

Truncate方法

该方法是通过调用BDE API函数实现的 其实现如下

procedure TBlobStream Truncate;

begin

if FOpened then

begin

Check(DbiTruncateBlob(FDataSet Handle FRecord FFieldNo FPosition))

FModified := True;

end;

end;

该方法从BLOB流的当前位置起删除所有数据 并设置修改标志FModified为True 在Delphi VCL中许多部件特别是数据库应用方面的部件都用BDE API函数完成对数据库的访问 如Data Access和Data Control部件 各种数据库部件都是BDE API函数外层的包装简化了对数据库的访问 *** 作 BDE API中还提供了避开BDE配置工具在程序中直接处理Alias(建立 修改 删除等)的函数支持 这也是部件所没有提供的 在Delphi数据库应用安装程序中 这些Alias *** 作函数无疑是相当重要的 有关BDE API函数的详细介绍 可阅读Delphi Client/Server Suite所带的BDE API 帮助文件

读写对象的实现原理和应用

读写对象(Filer)包括TFiler对象 TReader对象和riter对象 TFiler对象是文件读写的基础对象 在应用程序中使用的主要是TReader和riter TReader和riter对象都直接从TFiler对象继承 TFiler对象定义了Filer对象的基本属性和方法

Filer对象主要完成两大功能

● 存取窗体文件和窗体文件中的部件

● 提供数据缓冲 加快数据读写 *** 作

TFiler对象

TFiler对象是TReader和riter的抽象类 定义了用于部件存储的基本属性和方法 它定义了Root属性 Root指明了所读或写的部件的根对象 它的Create方法将Stream对象作为传入参数以建立与Stream对象的联系 Filer对象的具体读写 *** 作都是由Stream对象完成 因此 只要是Stream对象所能访问的媒介都能由Filer对象存取部件 TFiler 对象还提供了两个定义属性的方法 DefineProperty和DefineBinaryProperty 这两个方法使对象能读写不在部件published部分定义的属性

因为Filer对象主要用于存取Delphi的窗体文件和窗体文件中的部件 所以要清楚地理解Filer对象就要清楚Delphi 窗体文件(DFM文件)的结构

DFM文件是用于Delphi存储窗体的 窗体是Delphi可视化程序设计的核心 窗体对应Delphi应用程序中的窗口 窗体中的可视部件对应窗口中的界面元素 非可视部件如TTable和TOpenDialog 对应Delphi应用程序的某项功能 Delphi应用程序的设计实际上是以窗体的设计为中心 因此 DFM文件在Delphi应用设计中也占很重要的位置 窗体中的所有元素包括窗体自身的属性都包含在DFM文件中

在Delphi应用程序窗口 界面元素是按拥有关系相互联系的 因此树状结构是最自然的表达形式 相应地 窗体中的部件也是按树状结构组织 对应在DFM文件中 也要表达这种关系 DFM文件在物理上 是以二进制方式存储的 在逻辑上则是以树状结构安排各部件的关系 Delphi编辑窗口支持以文本方式显示DFM文件 从该文本中可以看清窗体的树状结构 下面是DFM文件的文本显示

Object Form : TForm

Left =

Top =

ActiveControl = DBIMage

Object Panell: TPanel

Left =

Object DBLabel : TDBText

end

Object DBImage : TDBImage

end

end

Object Panel : TPanel

Left =

Object Label : TLable

end

end

Object Panel : TPanel

Left =

Object DBLabel : TDBText

end

end

end

关于DFM文件中存储属性值的规则 请参见自定义部件开发这一章

对照TFiler对象的属性 Root属性就表示部件树的根──窗体 Filer对象的许多方法都是读从根起始的树中所有的部件 Ancestor属性表示根的祖先对象 IgnoreChildren属性则是读部件时忽略根的子结点

下面介绍Filer对象的属性和方法

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25103

以上就是关于oracle数据库删除数据Delete语句和Truncate语句的使用比较全部的内容,包括:oracle数据库删除数据Delete语句和Truncate语句的使用比较、大数据量下如何高效过滤表中的某个字段、Truncate Table的用法讲解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10625192.html

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

发表评论

登录后才能评论

评论列表(0条)

保存