개발자로부터 작업시 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
 
 
그런데 의문점이 생겼다.
세개의 세션을 가지고 세개의 테이블에 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-rchwin.jpg
 이 글의 권한은 dbtown.net 에 있습니다.
자료를 스크랩하실땐 출처를 밝혀주세요 ^^