Oracle 中 DELETE 與 TRUNCATE 語句的區別及優缺點
通常,我們可以使用 TRUNCATE或 DELETE語句刪除表中的記錄。TRUNCATE語句的通常更高效,但是它的使用需要格外注意。TRUNCATE屬於 DDL語句,這意味著 Oracle會在該語句執行後自動提交該語句及當前session中的事務,因此我們無法回滾 TRUNCATE語句。與此同時,又因為 TRUNCATE屬於 DDL語句,我們無法在一個事務中 truncate兩張不同的表。如下所示:
TRUNCATE語句刪除COMPUTER_SYSTEMS表中的所有資料:
SQL> truncatetable computer_systems;
在 truncate一張表時,預設情況下,除了該表的
SQL> truncatetable computer_systems reuse storage;
我們可以查詢 DBA/ALL/USER_EXTENTS檢視檢視該表的 extent是否已回收,例如:
set pagesize 50000
set long 9999
selectdbms_metadata.get_ddl('TABLE','TEST','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','TEST','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE"SCOTT"."TEST"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULTCELL_FLAS
H_CACHE DEFAULT)
TABLESPACE "USERS"
SQL> insert intotest select * from emp;
14 rows created.
SQL> /
14 rows created.
SQL> /
14 rows created.
SQL> /
14 rows created.
SQL> /
14 rows created.
SQL> selectcount(*) from user_extents where segment_name = 'TEST';
COUNT(*)
----------
2
SQL> truncatetable test;
Table truncated.
SQL> selectcount(*) from user_extents where segment_name = 'TEST';
COUNT(*)
----------
1
如果在刪除資料時需要選擇回滾而不提交操作,應選擇使用 DELETE語句。但是 DELETE語句的缺點是它會生成大量的 undo和 redo資訊。因此,對於大表,TRUNCATE語句通常是刪除表資料最快的方法。TRUNCATE語句的另一優勢是可以將表的高水位線重置為 0。我們可以利用 Truncate語句的這一特點,調整全表查詢的效能,通過TRUNCATE語句釋放表的高水位線,讓表中的行記錄儲存在高水位線以下的塊中,大幅提高全表掃描的效率。Truncate語句除了無法回滾外,還有一個缺點:如果一張父表上定義的主鍵被子表作為外來鍵約束引用,即使子表包含 0行記錄,父表也無法刪除。在這種情景下嘗試 truncate父表時,Oracle會丟擲如下異常:
SQL> truncatetable dept;
truncate table dept
*
ERROR at line 1:
ORA-02266:unique/primary keys in table referenced by enabled foreign keys
Oracle的內部機制會阻止 truncate父表,因為在多使用者系統中,在您先 truncate子表再 truncate父表的時間間隔內,存在另一個 session向子表插入記錄的可能性。在這種場景下,您必須臨時禁用表的外來鍵約束後才能執行 TRUNCATE語句,然後再重新啟用外來鍵約束。
對比 TRUNCATE和 DELETE語句的行為。Oracle允許在子表引用了外來鍵約束的情況下使用 DELETE語句刪除父表的記錄。這是因為 DELETE會生成 undo屬於read-consistent操作,可以進行回滾。使用 DELETE語句時,必須使用COMMIT或 ROLLBACK來完成事務。
SQL> delete fromtest;
28 rows deleted.
SQL> commit;
Commit complete.
注意:commit語句可以使 delete語句的操作永久生效。還可以使用其他的方式隱含提交事務,例如在delete語句執行後續的 DDL語句或者以正常方式退出客戶端連線工具(sqlplus)。
如果執行 ROLLBACK語句而不執行COMMIT語句,則表中的資料會和執行 DELETE語句之前一樣。在執行 DML語句時,可以查詢V$TRANSACTION檢視來了解事務的詳細資訊,例如,如果往表中插入了資料,在執行 COMMIT或 ROLLBACK之前,可以通過如下方式檢視當前連線 session的活動事務的資訊:
SQL> insert intotest select * from emp;
14 rows created.
SQL> selectTADDR,USERNAME from v$session where username ='SCOTT';
TADDR USERNAME
--------------------------------------
36C71818 SCOTT
SQL> selectXIDUSN,XIDSLOT,XIDSQN from v$transaction where addr = '36C71818';
XIDUSN XIDSLOT XIDSQN
-------------------- ----------
6 3 746
SQL> commit;
SQL> selectTADDR,USERNAME from v$session where username ='SCOTT';
TADDR USERNAME
--------------------------------------
SCOTT
DELETE語句和 TRUNCATE語句的區別:
DELETE語句既可以提交也可以回滾,TRUNCATE語句在執行後自動提交;
DELETE語句生成 UNDO資訊,TRUNCATE語句不生成或生成量很少;
DELETE語句無法釋放表的高水位,TRUNCATE可以;
DELETE語句不受外來鍵約束影響,TRUNCATE受影響;
在刪除大表資料時,DELETE效率遠低於TRUNCATE。
刪除表資料時還有一種非常快的方法:先 drop然後重建表,不過在重建表後您需要重建屬於該表的所有索引、約束、授權和觸發器。此外,在 drop表時重建表過程中,該表會短暫不可用,通常這種方式只允許在開發或測試環境使用。
轉載請註明作者出處及原文連結,否則將追究法律責任:
作者:xiangsir
原文連結:http://blog.csdn.net/xiangsir/article/details/9063597
QQ:444367417
相關推薦
Oracle 中 DELETE 與 TRUNCATE 語句的區別及優缺點
通常,我們可以使用 TRUNCATE或 DELETE語句刪除表中的記錄。TRUNCATE語句的通常更高效,但是它的使用需要格外注意。TRUNCATE屬於 DDL語句,這意味著 Oracle會在該語
mysql 刪除操作中delete與truncate的區別?
delete刪除的時候是一條一條的刪除記錄,它配合事務(rollback 回滾),可以將刪除的資料找回。 truncate刪除,它是將整個表摧毀,然後再建立一張一模一樣的表。它刪除的資料無法找回。 整個表
oracle中delete、truncate、drop的區別
一、delete 1、delete是DML,執行delete操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,可以通過rollb
ORACLE 中in與exists語句的區別(一)
select * from A where id in(select id from B) 以上查詢使用了in語句,in()只執行一次,它查出B表中的所有id欄位並快取起來.之後,檢查A表的id是否與B表中的id相等,如果相等則將A表的記錄加入結果集中,直到遍歷完A表的所有
Hibernate中getCurrentSession()與openSession()的區別及應用
rop 綁定 cto 關閉 hiberna code pre thread 線程 獲取openSession和CurrentSession: session=HibernateSessionFactory.getSession(); session=HibernateSes
Python中os與sys模組區別及使用方法
1.定義 os 與 sys 模組的不同的官方解釋 os:提供一種方便的使用作業系統函式的方法 sys:提供訪問由直譯器使用或維護的變數和在與直譯器互動使用到的函式。 因此, sys 模組區別於 os 模組,sys 模組提供了一系列的函式和變數,用於操控 python 的執行時環境,
oracle中char與varchar2的區別 | 面試
概括:char與varchar2都是Oracle的資料儲存格式。char是定長的,varchar2是變長。都可以儲存字串。 char是定長的 char(10) , varchar2(10)是變長的 當我們同樣存 a ,char佔用了10個字元(a佔一個,另外9個使用空格佔用),varch
js中setInterval與setTimeout的區別及換背景樣例
js中setInterval與setTimeout的區別 一、setInterval與setTimeout 1、setInterval(函式,
Oracle中Union與UnionAll的區別(union會合並多個重複結果)
轉自:http://www.educity.cn/wenda/389698.html Oracle中Union與UnionAll的區別如果我們需要將兩個select語 句的結果作為一個整 提問者: saixijiaoyu 釋出時間:2014-06-18
Oracle中資料庫與例項的區別
一個數據庫可以包含一個或者多個例項 例項的定義:由作業系統後臺程序和分配的記憶體區域構成。說 得簡單點就是oracle在nomount狀態就分配了記憶體區域,一個實 例也就差不多快形成了。 例項是個動態概念,它由一系列程序和記憶體區域組成;而資料庫是個靜
Oracle 中delete truncate 及drop的區別
Oracle 中刪除資料有三種方法:delete truncate drop 其中:delete 刪除資料表中記錄的語句,但是此語句並不能刪除表空間,它只能把被刪除的資料標記為unused。 用法: delete from 表名 where 條件,此過程可以回滾。 如果要刪除全部記錄,
oracle中drop、delete和truncate的區別
win style 刪除數據 oracl 數據庫 不能 存在 表空間 結構 oracle中可以使用drop、delete和truncate三個命令來刪除數據庫中的表, 1. delete和truncate都是刪除表中的內容而不能刪除表的結構,而drop則是刪除表的結構和內容
面試被問之-----sql優化中in與exists的區別 Mysql中 in or exists not exists not in區別 (網路整理) Sql語句中IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN
曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進
Sql語句中IN和exists的區別及應用
應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn 表展示 首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下: user表: order表: in 確定給定的值是否與子查
Oracle DELETE和TRUNCATE 的區別
提交 acl trigge llb 刪除 dex 語句 val let 語法delete from aa truncate table aa 區別 1.delete from後面可以寫條件,truncate不可以。 2.delete from記錄是一條條刪的,所刪除的每行
循環語句中break 與 continue的區別
ret tty dsm csdn 循環 ade 跳出循環 com %d 循環語句中break 與 continue的區別 總結: 1 break; while循環break是用於永久終止循環。即不執行本次循環中break後面的語句,直接跳出循環。 2con
迴圈語句中break 與 continue的區別
迴圈語句中break 與 continue的區別 總結: 1 break; while迴圈break是用於永久終止迴圈。即不執行本次迴圈中break後面的語句,直接跳出迴圈。 2continue; while迴圈continue是用於終止本次迴圈。即本次迴圈中c
ORACLE中查詢語句的執行順及where部分條件執行順序測試 Oracle中的一些查詢語句及其執行順序 Select 語句執行順序以及如何提高Oracle 基本查詢效率
Oracle中的一些查詢語句及其執行順序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查詢條件:1)LIKE:模糊查詢,需要藉助兩個萬用字元,%:表示0到多個字元;_:標識單個字元。2)IN(list):用來取出符合列表範圍中的資料。3)NOT I
Oracle資料庫中使用者與模式的區別與聯絡
使用者與模式 使用者(user):Oracle使用者是用連線資料庫和訪問資料庫物件的。(使用者是用來連線資料庫訪問資料庫)。 模式(schema):模式是資料庫物件的集合。模式物件是資料庫資料的邏輯結構。(把資料庫物件用模式分開成不同的邏輯結構)。 使用者(user)與模式(schema)的
Oracle instr與substr的區別及用法
一、instr函式是一個字串處理函式,它在Oracle/PLSQL中是返回子字串在源字串中的位置。 /* * 返回子字串在源字串中的位置(字串位置從1開始,而不是從0開始) * @param string 源字串 * @param substring 子字串