Oracle 中truncate與delete的區別
truncate是oracle中獨有的關鍵字吧!它的作用是清空一個表格,在刪除數據方面,其與delete有一些區別,以便自己記住:
1、在功能上,truncate是清空一個表的內容,它相當於delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete刪除整個表的數據時,會產生大量的roolback,佔用很多的rollback segments, 而truncate不會。
3、在內存中,用delete刪除數據,表空間中其被刪除數據的表佔用的空間還在,便於以後的使用,另外它是“假相”的刪除,相當於windows中用delete刪除數據是把數據放到回收站中,還可以恢復,當然如果這個時候重新啓動系統(OS或者RDBMS),它也就不能恢復了!
而用truncate清除數據,內存中表空間中其被刪除數據的表佔用的空間會被立即釋放,相當於windows中用shift+delete刪除數據,不能夠恢復!
4、truncate 調整high water mark 而delete不;truncate之後,TABLE的HWM退回到 INITIAL和NEXT的位置(默認)delete 則不可以。
5、truncate 只能對TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的對象必須是本模式下的,或者有drop any table的權限 而 DELETE 則是對象必須是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的權限。
7、在外層中,truncate或者delete後,其佔用的空間都將釋放。
8、truncate和delete只刪除數據,而drop則刪除整個表(結構和數據)。
delete 用法
Oracle Delete Statements
Version 10.2
Basic Delete Statements
1.Delete All Rows: DELETE <table_name>
or
DELETE FROM <table_name>;
CREATE TABLE t AS
SELECT *
FROM all_tables;
SELECT COUNT(*)
FROM t;
DELETE FROM t;
COMMIT;
SELECT COUNT(*)
FROM t;
2.Delete Selective Rows
DELETE FROM <table_name>
WHERE <condition>;
CREATE TABLE t AS
SELECT *
FROM all_tables;
SELECT COUNT(*)
FROM t;
DELETE FROM t
WHERE table_name LIKE '%MAP';
COMMIT;
SELECT COUNT(*)
FROM t;
3.Delete From A SELECT Statement
DELETE FROM (<SELECT Statement>);
CREATE TABLE t AS
SELECT *
FROM all_tables;
SELECT COUNT(*)
FROM t;
DELETE FROM (
SELECT * FROM t WHERE table_name LIKE '%MAP');
SELECT COUNT(*)
FROM t;
4.Delete With Returning Clause
DELETE FROM (<SELECT Statement>);
CREATE TABLE t AS
SELECT *
FROM all_tables;
set serveroutput on
DECLARE
r urowid;
BEGIN
DELETE FROM t
WHERE rownum = 1
RETURNING rowid INTO r;
dbms_output.put_line(r);
END;
/
5.Delete Restricted To A Partition
DELETE FROM <table_name>
PARTITION <partition_name>;
DELETE FROM sales PARTITION (q1_2001_invoices);
Delete From A Remote Database DELETE FROM <table_name>@<database_link>
DELETE FROM t@remote_db;
在刪除大數據量時(一個表中大部分數據時),
方法:
1、先將不需要刪除的數據複製到一個臨時表中
2、trunc table 表
3、將不需要刪除的數據複製回來。
delete只循環了一次,(去查並刪)
遊標循環了二次,(先查出來,再循環一次刪)