글수 4
개발자로부터 작업시 DB 에서 아래와 같은 에러메시지가 나왔다는 전달을 받았다.
OERR: ORA 55 maximum number of DML locks exceeded
에러 발생시 작업은 세개의 세션을 열어 각각의 3개의 테이블에 INSERT 하는 작업을 하였다고 한다.
2개는 정상적으로 작업중이고 3번째 insert 시 에러가 발생했다고 한다.
단 3개의 TABLE 은 파티션 TABLE 로써 130 개의 파티션을 가지고 있는 파티션 테이블이다.
현재 쥔장이 운영하는 DB 의 dml_locks 파라미터는 아래와 같이 1000 개로 설정되어 있다.
SQL> show parameter dml
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
dml_locks integer 1000
------------------------------------ ------- ------------------------------
dml_locks integer 1000
그런데 의문점이 생겼다.
세개의 세션을 가지고 세개의 테이블에 INSERT 를 하는데 왜 1000 개 이상의 DML LOCK 이 필요할까라는.
METALINK 를 뒤져본 결과 의문점이 풀렸다.
이유는 이랬다.
PARALLEL DML 시에는 한개의 LOCK 이 아닌 아래와 같이 파티션 별로 LOCK 이 발생한다.
그런데 단지 파티션 갯수만이 아닌 아래와 같은 공식으로 인한 lock 이 발생한다.
PARALLEL DML TOTAL LOCK = Cordinator lock + Parallel degree 수 + (파티션 수 * 3)
예를 들어 1개의 파티션 테이블이 100 개의 파티션을 가지고 있고 10 개의 DOP ( PARALLEL 갯수) 로 INSERT 을 수행했다고 하자.
1. coordinator
1개의 TABLE LOCK SX
100 개의 PARTITION LOCKS X
2. Parallel Execution Server Processes
10 개의 TABLE LOCK SX (PARALLEL 갯수)
100 개의 PARTITION LOCKS NULL
100 개의 PARTITION-WAIT LOCKS X
3. TOTAL
TOTAL 은 앞서 1+2 의 결과가 되며 이 예에서 보면 총 311 개의 DML LOCK 이 발생한다.
11 개의 TABLE LOCKS SX + 100 개의 PARTITION LOCKS X + 100 개의 PARTITION LOCKS NULL + 100 개의 PARTITION-WAIT LOCKS X
그럼 결론을 내보자.
이문제를 해결할수 있는 결론을 말하자면 DML LOCK 파라미터를 줄이거나 INSERT 갯수를 줄이는 수 밖에 없다.

이 글의 권한은 dbtown.net 에 있습니다.
자료를 스크랩하실땐 출처를 밝혀주세요 ^^
Skin Technical Note
Sites validated CSS, XHTML & IE6, IE7, FireFox, Opera and Safari Accessiable. Generator & Powered by Zeroboard XE. This site inspired by Slabovia and developed by WTA

