Pages

2014년 2월 18일 화요일

[ORACLE] TRUNCATE와 DELETE의 차이

- TRUNCATE 라는 명령은 해당 테이블의 모든 로우들을 잘라내는 기능을 하는 DDL 명령어로서 자동 커밋이 발생합니다.

- TRUNCATE TABLE 명령어를 수행하면 테이블의 구조는 남아있지만, 해당 테이블의 모든 컬럼의 내용이 삭제됩니다.
SQL> SELECT * FROM EMP_05;

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7654       7698 28-SEP-81          1250       1400         30
      7566       7839 02-APR-81          2975                    20
      7844       7698 08-SEP-98          1500          0         30
      7902       7566 03-NOV-81          3000                    20
      7368       7902 17-NOV-80           800                    20
      7839            17-NOV-81          5000                    40
      7521       7698 22-FEB-81          1250        500         30
      7698       7839 01-MAY-81          2850                    30
      7782       7839 09-JUN-81          2450                    10
      7934       7782 23-JAN-82          1300                    10
      7499       7698 20-FEB-81          1600        300         30

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7788       7566 09-NOV-82          3000                    20
      7900       7698 03-NOV-81          1957                    30
      7369       7902 17-NOV-80           800                    20
      7876       7788 12-JAN-83          1100                    20

15 rows selected.

SQL> TRUNCATE TABLE EMP_05;

Table truncated.

SQL> SELECT * FROM EMP_05;

no rows selected

SQL> ROLLBACK;

Rollback complete.

SQL> SELECT * FROM EMP_05;

no rows selected

SQL>
- TRUNCATE 명령어는 DDL로써 자동 커밋이 일어나기 때문에 DML 명령어인 DELETE와는 표면적인 기능은 같을지 모르겠지만 중요한 차이가 있습니다.
- DELETE 명령어를 수행할때 아무런 조건도 명시하지 않으면 테이블 내의 내용이 전부 삭제 됩니다. 하지만 테이블의 구조는 남아있습니다. 이러한 결과를 보면 DELETE와 TRUNCATE 명령어는 표면적인 기능은 같습니다. 하지만 TRUNCATE 명령어는 DDL 로써 자동 커밋이 일어나므로 삭제되기 이전 상태로 복귀할 수 없지만, DELETE는 DML 명령어이기 때문에 자동 커밋되지 않아서 언제든지 삭제되기 이전 상태로 롤백할 수 있습니다.
SQL> SELECT * FROM EMP_04
  2  ;

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7654       7698 28-SEP-81          1250       1400         30
      7566       7839 02-APR-81          2975                    20
      7844       7698 08-SEP-98          1500          0         30
      7902       7566 03-NOV-81          3000                    20
      7368       7902 17-NOV-80           800                    20
      7839            17-NOV-81          5000                    40
      7521       7698 22-FEB-81          1250        500         30
      7698       7839 01-MAY-81          2850                    30
      7782       7839 09-JUN-81          2450                    10
      7934       7782 23-JAN-82          1300                    10
      7499       7698 20-FEB-81          1600        300         30

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7788       7566 09-NOV-82          3000                    20
      7900       7698 03-NOV-81          1957                    30
      7369       7902 17-NOV-80           800                    20
      7876       7788 12-JAN-83          1100                    20

15 rows selected.

SQL> DELETE FROM EMP_04;

15 rows deleted.

SQL> SELECT * FROM EMP_04;

no rows selected

SQL> ROLLBACK;

Rollback complete.

SQL> SELECT * FROM EMP_04;

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7654       7698 28-SEP-81          1250       1400         30
      7566       7839 02-APR-81          2975                    20
      7844       7698 08-SEP-98          1500          0         30
      7902       7566 03-NOV-81          3000                    20
      7368       7902 17-NOV-80           800                    20
      7839            17-NOV-81          5000                    40
      7521       7698 22-FEB-81          1250        500         30
      7698       7839 01-MAY-81          2850                    30
      7782       7839 09-JUN-81          2450                    10
      7934       7782 23-JAN-82          1300                    10
      7499       7698 20-FEB-81          1600        300         30

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7788       7566 09-NOV-82          3000                    20
      7900       7698 03-NOV-81          1957                    30
      7369       7902 17-NOV-80           800                    20
      7876       7788 12-JAN-83          1100                    20

15 rows selected.

# 롤백이 가능하기 위해서는 하나의 행을 기준으로 수행될 때 무수히 많은 BEFORE IMAGE가 생성 됩니다. 그러므로 롤백 세그먼트에 허용량을 초과할 수 있습니다. 그러므로 만일 확신이 서는(명확히 삭제해야 하는)경우 DELETE 보다는 TRUNCATE 가 효율적입니다.
# TRUNCATE 는 한 테이블에 속하는 모든 로우를 잘라내는 것이지만, DELETE 명령어는 삭제하고자 하는 로우들을 선택할 수 있습니다.
SQL> SELECT * FROM EMP_04;

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7654       7698 28-SEP-81          1250       1400         30
      7566       7839 02-APR-81          2975                    20
      7844       7698 08-SEP-98          1500          0         30
      7902       7566 03-NOV-81          3000                    20
      7368       7902 17-NOV-80           800                    20
      7839            17-NOV-81          5000                    40
      7521       7698 22-FEB-81          1250        500         30
      7698       7839 01-MAY-81          2850                    30
      7782       7839 09-JUN-81          2450                    10
      7934       7782 23-JAN-82          1300                    10
      7499       7698 20-FEB-81          1600        300         30

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7788       7566 09-NOV-82          3000                    20
      7900       7698 03-NOV-81          1957                    30
      7369       7902 17-NOV-80           800                    20
      7876       7788 12-JAN-83          1100                    20

15 rows selected.

SQL> DELETE FROM EMP_04 
  2  WHERE EMPNO IN(7788, 7900);

2 rows deleted.

SQL> SELECT * FROM EMP_04;

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7654       7698 28-SEP-81          1250       1400         30
      7566       7839 02-APR-81          2975                    20
      7844       7698 08-SEP-98          1500          0         30
      7902       7566 03-NOV-81          3000                    20
      7368       7902 17-NOV-80           800                    20
      7839            17-NOV-81          5000                    40
      7521       7698 22-FEB-81          1250        500         30
      7698       7839 01-MAY-81          2850                    30
      7782       7839 09-JUN-81          2450                    10
      7934       7782 23-JAN-82          1300                    10
      7499       7698 20-FEB-81          1600        300         30

     EMPNO        MGR HIREDATE            SAL       COMM     DEPTNO
---------- ---------- ------------ ---------- ---------- ----------
      7369       7902 17-NOV-80           800                    20
      7876       7788 12-JAN-83          1100                    20

13 rows selected.

-- DELETE 명령어로 삭제된 내용이 완전하게 데이터베이스에 적용되도록 하려면 사용자가 직접 커밋 명령을 수행해야 합.
SQL> COMMIT;

Commit complete.

댓글 없음:

댓글 쓰기