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

truncate和delete的区别及DDL,DML,DCL,TCL 基础概念

 
阅读更多
truncate和delete的区别及DDL,DML,DCL,TCL 基础概念


先了解 DDL,DML,DCL,TCL 基础概念

对于SQL语言,有两个组成部分:

DML(data manipulation language):它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

DDL(data definition language):DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。 回答者:zhongsojun | 三级| 2009-9-1 19:30



SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,

数据定义语言DDL,数据控制语言DCL。

1 数据查询语言DQL

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE

子句组成的查询块:

SELECT <字段名表>

FROM <表或视图名>

WHERE <查询条件>

2 数据操纵语言

数据操纵语言DML主要有三种形式:

1) 插入:INSERT

2) 更新:UPDATE

3) 删除:DELETE



3 数据定义语言DDL

数据定义语言DDL用来创建数据库中的各种对象-----表、视图、

索引、同义词、聚簇等如:

CREATE TABLE/VIEW/INDEX/SYN/CLUSTER



4 数据控制语言DCL

数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制

数据库操纵事务发生的时间及效果,对数据库实行监视等。如:

1) GRANT:授权。

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。

回滚---ROLLBACK

回滚命令使数据库状态回到上次最后提交的状态。其格式为:

SQL>ROLLBACK;

3) COMMIT [WORK]:提交。 www.2cto.com

在数据库的插入、删除和修改操作时,只有当事务在提交到数据

库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看

到所做的事情,别人只有在最后提交完成后才可以看到。

提交数据有三种类型:显式提交、隐式提交及自动提交。下面分

别说明这三种类型。

(1) 显式提交

用COMMIT命令直接完成的提交为显式提交。其格式为:

SQL>COMMIT;

(2) 隐式提交

用SQL命令间接完成的提交为隐式提交。这些命令是:

ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,

EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交

若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,

系统将自动进行提交,这就是自动提交。其格式为:

SQL>SET AUTOCOMMIT ON;




&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&





实例对比Oracle中truncate和delete的区别
删除表中的数据的方法有delete,truncate,
它们都是删除表中的数据,而不能删除表结构,delete 可以删除整个表的数据也可以删除表中某一条或N条满足条件的数据,
而truncate只能删除整个表的数据,一般我们把delete 操作收作删除表,而truncate操作叫作截断表.
truncate操作与delete操作对比
操作 回滚 高水线 空间 效率
Truncate 不能 下降 回收 快
delete 可以 不变 不回收 慢


下面分别用实例查看它们的不同
1.回滚
首先要明白两点
1.在oracle 中数据删除后还能回滚是因为它把原始数据放到了undo表空间,
2.DML语句使用undo表空间,DDL语句不使用undo,而delete是DML语句,truncate是DDL语句,别外DDL语句是隐式提交.
所以truncate操用不能回滚,而delete操作可以.
两种操作对比(首先新建一个表,并插入数据)
SQL> create table t
2 (
3 i number
4 );
Table created.
SQL> insert into t values(10);
SQL> commit;
Commit complete.
SQL> select * from t;
I
----------
10

Delete删除,然后回滚
SQL> delete from t;
1 row deleted.
SQL> select * from t;
no rows selected
#删除后回滚
SQL> rollback;
Rollback complete.
SQL> select * from t;
I
----------
10

Truncate截断表,然后回滚.
SQL> truncate table t;
Table truncated.
SQL> rollback;
Rollback complete.
SQL> select * from t;
no rows selected

可见delete删除表还可以回滚,而truncate截断表就不能回滚了.(前提是delete操作没有提交)

2.高水线
所有的Oracle表都有一个容纳数据的上限(很象一个水库历史最高的水位),
我们把这个上限称为“high water mark”或HWM。这个HWM是一个标记(专门有一个数据块用来记录高水标记等),
用来说明已经有多少数据块分配给这个表. HWM通常增长的幅度为一次5个数据块.
delete语句不影响表所占用的数据块, 高水线(high watermark)保持原位置不动
truncate 语句缺省情况下空间释放,除非使用reuse storage; truncate会将高水线复位
下面对两种操作对比
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select segment_name,blocks from dba_segments where segment_name=upper('t');
SEGMENT_NAME BLOCKS
------------------------------ ----------
T 24
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T 20 3

USER_TABLES.BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。
注意:USER_TABLES.BLOCKS EMPTY_BLOCKS (20+3=23)比DBA_SEGMENTS.BLOCKS少一个数据库块,
这是因为有一个数据库块被保留用作表头。DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。
USER_TABLES.BLOCKS表示已经使用过的数据库块的数目(水线)。
Delete删除表,
SQL> delete from t;
10000 rows deleted
SQL> commit;
Commit complete.
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ----------------------------------------------------------------
T 20 3

Truncate截断表
SQL> truncate table t;
Table truncated.
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME BLOCKS EMPTY_BLOCKS
------------------------------ ---------- --------------------------------------------------------
T 0 7

可见,delete表,BLOCK(高水线)不变,而truncate表BLOCKS(高水线)变为0
现在我们也看到blocks+empty_blocks=7,也就是oracle分配区时默认一次7+1(表头)=8个blocks;
高水线的作用: HWM对数据库的操作有如下影响:
a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
因此高水线是oracle优化时一个重要的参数
3.空间
既然高水线用来说明已经有多少数据块分配给这个表,那么高水线也可理解为表的空间占用。
即使delete将表中的数据全部删除,HWM还是为原值,所以还有那么多的空间分配给这个表,即它的空间还没有回收,
而truncate表后高水线变为0,那现在它就表示没有分配空间,即它的空间被回收了。
4.效率
要想查看delete,truncate那个效率更高,先构建一个大表,然后查看它们分别对些表删除所需的时间。
有个相当形象的比喻:领导给你两本书让你扔掉,delete就是你守在复印机前,把书一页页撕下来复印一份,
再一页页扔到垃圾桶里,truncate就是直接把两本书扔到垃圾桶里,那个快那个慢不言而喻。
先在表中插入100000条记录,并打开时间
SQL> set timing on;
SQL> begin
2 for i in 1..100000 loop
3 insert into t values('10');
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:01:12.50

Delete删除表
SQL> delete from t;
100000 rows deleted.
Elapsed: 00:00:20.09

Truncate 截断表
#先把表回滚
SQL> rollback;
Rollback complete.
Elapsed: 00:00:17.36
SQL> select count(*) from t;
COUNT(*)
-------------------
100000
Elapsed: 00:00:00.01
SQL> truncate table t;
Table truncated.
Elapsed: 00:00:00.20

可见删除同一个大小的表,delete用了20.09秒,而truncate只用了0.2秒.
本文出自 “追求” 博客,请务必保留此出处http://chenxy.blog.51cto.com/729966/168459









分享到:
评论

相关推荐

    MySQL基础速记

    SQL命令分可以分为四组:DDL、DML、DCL和TCL。四组中包含的命令分别如下 (图片来源见水印) DDL DDL是数据定义语言(Data Definition Language)的简称,它处理数据库schemas和描述数据应如何驻留在数据库中。 ...

    SQL Server 2014 Development Essentials - Masood-Al-Farooq, Basit A. [SRG].pdf

    Chapter 2, Understanding DDL and DCL Statements in SQL Server, introduces the reader to the SQL Server 2014 Transact-SQL language elements and SQL Server 2014 Management Studio (SSMS 2014). This ...

    oracle学习笔记

    数据操作语言(Data Manipulating LANGUAGE DML)--- insert,delete,update 数据定义语言(Data Definition Langueage DDL)--- create,alter,drop,rename,truncate 数据控制语言(Data Control Langueage DCL)--- ...

    MySQL语句整理及汇总介绍

    DDL(Database Definition Language,数据定义语言)语句:主要由CREATE、ALTER、DROP和TRUNCATE四个关键字完成 DML(Database Manipulation Language,数据操作语言)语句:主要由INSERT、UPDATE和DELETE三个...

    oracle课件从入门到高级2

    • DML(data manipulation language): insert、update、delete、merge • DDL(data definition language): create、alter、drop、rename、truncate • 事务控制:commit、rollback、savepoint • DCL(数据控制语言)...

    Oracle10g 知识总结

    数据操作语句(DML):insert into 、delete、update、merge (3).数据定义语句(DDL):create 、alter、drop、truncate (4).数据控制语句(DCL):grant、revoke (5).事物控制语句(TCL):commit、rollback、savepoint

    oracle课件从入门到高级1

    • DML(data manipulation language): insert、update、delete、merge • DDL(data definition language): create、alter、drop、rename、truncate • 事务控制:commit、rollback、savepoint • DCL(数据控制语言)...

    Oracle数据库表的基本操作以及空值问题的解决

    区分delete,drop,truncate?(面试题)3.常见命令:4.Oracle数据库的数据类型:5.null:6.nvl(字段1,值1): 1.Oracle数据库语言分类: 1)DDL:数据定义语言,对数据结构起作用 create:创建某对象 alter:修改某对象 ...

    orcale常用命令

    读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。 2、startup mount dbname 安装启动,这种方式启动下可执行: 数据库日志归档、 数据库介质恢复、 使数据文件联机或脱机, ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    安信通数据库审计系统.doc

    7、能够审计到客户端系统用户名、数据库用户名、客户端程序及路径 8、数据库流量、客户端流量 9、数据库访问者违规报警结果 审计内容: DDL类:CREATE、ALTER、DROP、COMMENT、TRUNCATE、REPLACE、DECLARE DML类:...

    经典全面的SQL语句大全

     DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)  首先,简要介绍基础语句:  1、说明:创建数据库 CREATE DATABASE database-name  2、说明:删除...

    oracle数据库经典题目

    2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须使用关键字Distinct; 在需要返回查询结果中的所有行时,可以使用关键字ALL...

    最全的oracle常用命令大全.txt

    一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;svrmgrl SVRMGR&gt;connect internal SVRMGR&gt;startup SVRMGR&gt;quit b、关闭...

Global site tag (gtag.js) - Google Analytics