Oracle - 테이블 갱신시 발생한 락을 해결하는 방법
Posted 08 1, 2010 11:53, Filed under: DataBase/Oracle
# 한번의 광고 클릭으로, 당신을 대신해서 불우이웃을 도울 기회가 많아집니다.
- 테이블을 제거하는 명령어로 DROP이란 명령어가 있습니다.
이는 DLL 언어로서 이를 수행하면 문장 하나가 실행됨과 동시에 바로 자동 커밋하여 트랜잭션을 종료 하지만 테이블 내의 행을 삭제하는 명령어인 DELETE는 DML 언어로서 언두 세그먼트(UNDO SEGMENT)에 이전 이미지를 저장하고 있다가 사용자가 커밋이나 롤백 명령어를 수행할 때에서야 트랜잭션이 끝나게 됩니다.
- 한 사용자가 ALTER TABLE ~ DROP 명령어로 특정 컬럼을 삭제하는 작업을 하면 해당 컬럼에 있는 모든 자료도 삭제 된 후에 컬럼이 삭제 되야 하므로 해당 컬럼에 데이터가 많은 경우는 작업 시간이 오래 걸릴 수도 있습니다.
- 테이블을 갱신할 때 발생한 락을 해결하는 방법을 학습해 보도록 하겠습니다. 앞서 학습한 바와 같이 SET UNUSED 라는 키워드는 해당 컬럼을 실제로 삭제하는 게 아니라 삭제 될 것이라고 표시만 하는 논리적 삭제만 일어나므로 실제 수행 시간은 극히 짧습니다. 따라서 락이 걸리는 시간도 극히 짧으므로 다른 사용자의 사용 제한 시간이 상대적으로짧아지게 됩니다.
- 그러므로 테이블이 자주 사용되는 시간(근무시간)에는 불필요하게 된 컬럼을 바로삭제하지 말고 우선 SET UNUSED 라는 키워드로 다른 사용자들이 접근하지 못하도록 제한만 둡니다.
# UNUSED 속성을 지정한 컬럼을 다시 USED로 변경하는 작업은 없는듯 합니다.
참고 자료 : 클릭하세요. 오라클 10g + PL/SQL 입문
이는 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 락이 걸려 있으므로 뒤에 오는 사용자는 선행 작업이 끝날 대가지 기다려야만 합니다. 이런 경우에 뒤의 사용자를 기다리게 하지 않기 위한 해결 방법을 찾아보도록 하겠습니다.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)
- 테이블을 갱신할 때 발생한 락을 해결하는 방법을 학습해 보도록 하겠습니다. 앞서 학습한 바와 같이 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
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 입문
"DataBase / Oracle" 분류의 다른 글
| Oracle - SYS_CONTEXT 함수를 이용하여 접속 세션 정보 추출 (2) | 2011/12/13 |
| Oracle - ASSM(Automatic Segment Space Management) (0) | 2011/09/18 |
| Oracle - 사용자의 테이블 스페이스 검색및 이동 (0) | 2011/09/18 |
| Oracle - 9i 설치관련 패치(Requirements for Installing Oracle 9iR2 on RHEL 4) (0) | 2011/09/01 |
| Oracle - 삭제된 데이타 복구하기 (0) | 2011/08/04 |
| Oracle - SQL문으로 oracle alert 로그 확인 (0) | 2011/06/21 |
| Oracle - Export, Import (0) | 2011/05/29 |
| Oracle - Control File 파일 장애 복구 (0) | 2011/05/15 |
| Oracle - 사용자 관리. (0) | 2011/05/07 |
| Oracle - ORA-01157, ORA-01110 테이블 스페이스 에러 (0) | 2011/05/01 |
# 한번의 광고 클릭으로, 당신을 대신해서 불우이웃을 도울 기회가 많아집니다.
Tag : unused
Response :
0 Trackback
,
0 Comment
Trackback URL : http://develop.sunshiny.co.kr/trackback/531