| tangsuilx 回复于:2004-02-04 11:24:11
|
高,
请教一下,我在某个应用程序改造中,
原程序是for informix的,在删除所有数据时,使用drop+create。
改成for oracle 9i时,因为drop和create是ddl语句,会自动commit,
只好改成用truncate,但是没有自动commit,是否可以认为truncate不是ddl语句。
这些表都有上千万条记录,用delete肯定不行的。
|
| oraix 回复于:2004-02-04 13:37:22
|
truncate是DDL
|
| Fenng 回复于:2004-02-04 14:30:55
|
[quote:3f920216b3]4.速度,一般来说: drop> truncate > delete [/quote:3f920216b3]
你说的一般都是什么情况下呢?
SQL> create table test as select * from all_objects where rownum<10000;
Table created.
Elapsed: 00:00:01.38
SQL> drop table test;
Table dropped.
[b:3f920216b3]Elapsed: 00:00:00.11[/b:3f920216b3]
SQL> create table test as select * from all_objects where rownum<10000;
Table created.
Elapsed: 00:00:01.39
SQL> truncate table test;
Table truncated.
[b:3f920216b3]Elapsed: 00:00:00.09[/b:3f920216b3]
SQL>
|
| txfy 回复于:2004-02-04 14:42:53
|
这么少的数据没什么比较价值,用的时间太少,看不出来效果,怎么也弄个几百m数据看看!
|
| tanglow 回复于:2004-02-04 16:16:53
|
在SYBASE数据库系统中
三个命令的功能基本上也是这样的.
|
| troyzeng 回复于:2004-02-04 17:21:20
|
我们就需要这样的总结和讨论!很好!可惜我是新手,学习中,要不也说说自己的想法。
|
| rman9i 回复于:2004-02-04 23:26:26
|
在实际应用中,三者的区别是明确的。
当你不再需要该表时, 用 drop;
当你仍要保留该表,但要删除所有记录时, 用 truncate;
当你要删除部分记录时(always with a WHERE clause), 用 delete.
|
| tangsuilx 回复于:2004-02-05 09:49:19
|
[quote:f87e40d343="oraix"]truncate是DDL[/quote:f87e40d343]
可是事务中的DDL语句会引起COMMIT的啊,
我在应用中使用truncate删除某个表的数据后,装入其他
数据,后面的处理出错后,能回滚成原来的数据。
请给个解释,要不然我糗大了。
|
| oraix 回复于:2004-02-05 09:50:00
|
总结得未必完全正确, 算是抛砖引玉, 有错漏不明之处欢迎大家来讨论指出
希望大家都能来做做类似的东西, 共同提高. 我想这些也是大家来论坛的目的之一.
|
| txfy 回复于:2004-02-05 10:00:03
|
[quote:94ac1c9c53="tangsuilx"]
可是事务中的DDL语句会引起COMMIT的啊,
我在应用中使用truncate删除某个表的数据后,装入其他
数据,后面的处理出错后,能回滚成原来的数据。
请给个解释,要不然我糗大了。[/quote:94ac1c9c53]
我测试无法回滚呀!
create or replace procedure testtruncate
is
begin
execute immediate 'truncate table testtrun';
insert into testtrun values('3');
rollback;
commit;
end;
--------------------------------------------------------------------------
SQL> select * from testtrun;
I
---
2
1
SQL> exec testtruncate;
PL/SQL 过程已成功完成。
SQL> select * from testtrun;
未选定行
可以看出truncate虽然没有commit但是仍然无法回滚,而后来插入的3由于没有提交被回滚了。
|
| rman9i 回复于:2004-02-05 10:08:32
|
[quote:724d0056b3="tangsuilx"]
可是事务中的DDL语句会引起COMMIT的啊,
我在应用中使用truncate删除某个表的数据后,装入其他
数据,后面的处理出错后,能回滚成原来的数据。
请给个解释,要不然我糗大了。[/quote:724d0056b3]
truncate 的确是DDL.
|
| oraix 回复于:2004-02-05 10:27:43
|
[quote:8d4b7ecc0b="tangsuilx"]
可是事务中的DDL语句会引起COMMIT的啊,
我在应用中使用truncate删除某个表的数据后,装入其他
数据,后面的处理出错后,能回滚成原来的数据。
请给个解释,要不然我糗大了。[/quote:8d4b7ecc0b]
truncate是DDL , 执行后,之前的事务自动提交, 无法回滚
|
| david5337 回复于:2004-11-28 13:16:21
|
晓得了!
Truncate是不会全部释放存储空间的!
Drop会释放存储空间,呵呵!
这个问题有点困扰我了!
|
| freet15 回复于:2004-11-28 17:23:24
|
[quote:e75d85c55d="rman9i"]在实际应用中,三者的区别是明确的。
当你不再需要该表时, 用 drop;
当你仍要保留该表,但要删除所有记录时, 用 truncate;
当你要删除部分记录时(always with a WHERE clause), 用 delete.[/quote:e75d85c55d]
这个说法就比较通俗,truncate是不会释放存储空间的,drop就比较狠一点。
[quote:e75d85c55d="david5337"]晓得了!
Truncate是不会全部释放存储空间的!
Drop会释放存储空间,呵呵!
这个问题有点困扰我了![/quote:e75d85c55d]
如同David的意思,但是不知道困扰David是什么?!
|
| feijin 回复于:2004-11-28 23:02:53
|
truncat 不触发trigger ??? 几年来我一直没有注意过 晕阿
|