오라클 락 - Enq : us contention

2025. 2. 3. 00:03IT/Oracle

반응형

Enq:us contention

  • ENQ: US - contention 대기 이벤트는 오라클 데이터베이스에서 발생하는 잠금(contention) 대기 이벤트 중 하나로, 주로 UNDO SEGMENT(US) 관련 리소스 경쟁이 있을 때 나타납니다.
  • 이 이벤트는 오라클 데이터베이스에서 트랜잭션이 발생할 때 UNDO 세그먼트에 대한 잠금 경합이 일어나는 상황을 설명합니다.
  • 일반적으로 UNDO 세그먼트는 트랜잭션 롤백을 지원하고, 데이터의 일관성을 유지하는데 중요한 역할을 합니다.
  • 그러나 여러 세션이 동시에 같은 UNDO 세그먼트에 접근하려 할 때, 리소스 경합이 발생할 수 있습니다.

주요 원인

ENQ: US - contention 대기 이벤트는 여러 상황에서 발생할 수 있습니다:

  1. UNDO 세그먼트 부족
    • 트랜잭션이 많아져서 할당 가능한 UNDO 세그먼트가 부족한 경우에 발생할 수 있습니다.
    • 하나의 UNDO 세그먼트에 여러 트랜잭션이 동시에 접근하면 경합이 발생하게 됩니다.
  2. UNDO 세그먼트 확장 문제
    • UNDO 세그먼트가 확장되거나 새로 할당될 때 경합이 발생할 수 있습니다. 이때 UNDO 세그먼트를 늘리기 위한 시간이 걸리면서 대기 상태가 됩니다.
  3. 작은 UNDO 테이블스페이스
    • UNDO 테이블스페이스의 크기가 작거나 트랜잭션 부하가 많을 때 발생할 수 있습니다. 테이블스페이스가 충분하지 않으면 경합이 더 빈번하게 발생합니다.
  4. 오래 지속되는 트랜잭션
    • 대용량 트랜잭션이나 오랜 시간 동안 완료되지 않는 트랜잭션이 있으면 해당 트랜잭션이 UNDO 리소스를 장기간 점유하여 다른 세션과의 경합이 발생할 수 있습니다.

해결 방안

  1. UNDO 테이블스페이스 크기 조정
    • UNDO 테이블스페이스의 크기를 늘려 트랜잭션 처리 중 발생하는 경합을 줄일 수 있습니다.
    • AUTOEXTEND 옵션을 설정하여 UNDO 테이블스페이스가 자동으로 확장되도록 설정할 수도 있습니다.
  2. UNDO 세그먼트 수 증가
    • UNDO 세그먼트의 수를 증가시키면 경합이 줄어듭니다. UNDO 세그먼트는 트랜잭션에 할당되는 단위이기 때문에, 세그먼트 수가 많을수록 경합이 줄어들 수 있습니다.
  3. 적절한 UNDO_RETENTION 설정
    • UNDO_RETENTION 값을 적절하게 조정하여 오래된 UNDO 데이터가 오랫동안 보존되지 않도록 할 수 있습니다. 너무 높은 값을 설정하면 오래된 트랜잭션이 UNDO 세그먼트를 차지할 수 있습니다.
  4. 트랜잭션 크기 조절
    • 대규모 트랜잭션은 여러 개의 작은 트랜잭션으로 나누어 처리하는 것이 좋습니다. 트랜잭션이 작아지면 UNDO 리소스 점유 시간이 짧아지고, 경합이 줄어듭니다.
  5. 트랜잭션 모니터링:
    • 장기 실행되는 트랜잭션을 모니터링하고, 불필요한 트랜잭션이 계속해서 실행되고 있는지 확인하는 것이 중요합니다. 특히 특정 세션이 UNDO 리소스를 과도하게 사용하고 있다면 해당 세션을 종료하는 것이 도움이 될 수 있습니다.

관련 뷰를 통한 분석

  1. V$SESSION
    • 현재 UNDO 세그먼트와 관련된 트랜잭션 정보를 조회할 수 있습니다.
SELECT sid, event, p1text, p1, p2text, p2, p3text, p3
FROM v$session
WHERE event = 'enq: US - contention';

 

    2. V$UNDOSTAT

  • UNDO 테이블스페이스의 사용량 및 트랜잭션 관련 통계를 조회할 수 있습니다.
SELECT begin_time, end_time, undoblks, txncount, maxquerylen
FROM v$undostat
ORDER BY begin_time DESC;

 

   3. DBA_UNDO_EXTENTS

  • UNDO 테이블스페이스의 extents 관련 정보를 조회하여 경합이 발생하는 원인을 분석할 수 있습니다.
SELECT segment_name, tablespace_name, status, bytes, blocks
FROM dba_undo_extents
WHERE status = 'ACTIVE';
반응형