- 테이블을 제거하는 명령어로 DROP이란 명령어가 있습니다.
이는 DLL 언어로서 이를 수행하면 문장 하나가 실행됨과 동시에 바로 자동 커밋하여 트랜잭션을 종료 하지만 테이블 내의 행을 삭제하는 명령어인 DELETE는 DML 언어로서 언두 세그먼트(UNDO SEGMENT)에 이전 이미지를 저장하고 있다가 사용자가 커밋이나 롤백 명령어를 수행할 때에서야 트랜잭션이 끝나게 됩니다.
- 한 사용자가 ALTER TABLE ~ DROP 명령어로 특정 컬럼을 삭제하는 작업을 하면 해당 컬럼에 있는 모든 자료도 삭제 된 후에 컬럼이 삭제 되야 하므로 해당 컬럼에 데이터가 많은 경우는 작업 시간이 오래 걸릴 수도 있습니다.

SQL> CREATE TABLE EMP03
  2  AS SELECT * FROM EM01
  3  ;

Table created.

SQL> DESC EMP03
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

-- 컬럼을 삭제하는 작업이 진행될 경우 다른 사용자는 해당 테이블을 이용할 수 없다. 이때 DDL lock이 발생하게 된다.
SQL> ALTER TABLE EMP03 DROP COLUMN ENAME;

Table altered.

SQL> DESC EMP03
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)
- 그런데 이때 또 다른 사용자가 해당 테이블을 접근해서 DML 등의 작업을 하려한다면 해당 테이블은 ALTER 구문에 의해 이미 DDL 락이 걸려 있으므로 뒤에 오는 사용자는 선행 작업이 끝날 대가지 기다려야만 합니다. 이런 경우에 뒤의 사용자를 기다리게 하지 않기 위한 해결 방법을 찾아보도록 하겠습니다.
- 테이블을 갱신할 때 발생한 락을 해결하는 방법을 학습해 보도록 하겠습니다. 앞서 학습한 바와 같이 SET UNUSED 라는 키워드는 해당 컬럼을 실제로 삭제하는 게 아니라 삭제 될 것이라고 표시만 하는 논리적 삭제만 일어나므로 실제 수행 시간은 극히 짧습니다. 따라서 락이 걸리는 시간도 극히 짧으므로 다른 사용자의 사용 제한 시간이 상대적으로짧아지게 됩니다.
- 그러므로 테이블이 자주 사용되는 시간(근무시간)에는 불필요하게 된 컬럼을 바로삭제하지 말고 우선 SET UNUSED 라는 키워드로 다른 사용자들이 접근하지 못하도록 제한만 둡니다.
SQL> CREATE TABLE EMP04
  2  AS SELECT * FROM EM01
  3  ;

Table created.

SQL>
SQL>
SQL>
SQL> DESC EMP04
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

-- 실제로 ENAME 컬럼이 존재하지만 논리적으로 사용을 제한하기 위해서 UNUSED 속성을 지정한다.
-- 속성을 지정한후에는 ENAME 컬럼이 검색 되지 않는다.
SQL> ALTER TABLE EMP04 SET UNUSED(ENAME);

Table altered.

SQL> DESC EMP04  
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

-- UNUSED 설정이 되어있는 컬럼을 삭제 한다.
SQL> ALTER TABLE EMP04 DROP UNUSED COLUMNS;

Table altered.

SQL> DESC EMP04
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                 

# UNUSED 속성을 지정한 컬럼을 다시 USED로 변경하는 작업은 없는듯 합니다.




참고 자료 : 클릭하세요. 오라클 10g + PL/SQL 입문


08 1, 2010 11:53 08 1, 2010 11:53

Trackback URL : http://develop.sunshiny.co.kr/trackback/531

Leave a comment

« Previous : 1 : ... 64 : 65 : 66 : 67 : 68 : 69 : 70 : 71 : 72 : ... 365 : Next »

Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217712 HIT
TODAY 14 HIT
YESTERDAY 115 HIT