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 , 执行后,之前的事务自动提交, 无法回滚
|