Oracle 미드레벨 기술면접
새 면접Q. Oracle에서 B-Tree 인덱스와 Bitmap 인덱스의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적합한지 설명해주세요.
데이터의 카디널리티(고유값의 비율)와 DML 작업 빈도를 고려해보세요.
B-Tree 인덱스는 높은 카디널리티를 가진 컬럼(예: 주민번호, 이메일)에 적합하며, 범위 검색과 정렬에 효율적입니다. Bitmap 인덱스는 낮은 카디널리티를 가진 컬럼(예: 성별, 상태코드)에 적합하며, 여러 조건을 AND/OR로 결합하는 쿼리에서 비트 연산으로 빠른 성능을 제공합니다. B-Tree는 DML 작업이 빈번한 OLTP 환경에 적합하고, Bitmap은 읽기 위주의 DW/OLAP 환경에 적합합니다. Bitmap 인덱스는 DML 시 전체 비트맵 블록을 잠그므로 동시성이 떨어지는 단점이 있습니다.
- • B-Tree는 높은 카디널리티, Bitmap은 낮은 카디널리티에 적합
- • Bitmap은 복합 조건 검색 시 비트 연산으로 우수한 성능 제공
- • B-Tree는 OLTP, Bitmap은 OLAP 환경에 적합
- • Bitmap은 DML 시 동시성 문제 발생 가능
대용량 데이터 웨어하우스에서 성별, 지역 등 저카디널리티 컬럼을 조합한 분석 쿼리 최적화에 활용됩니다.
Function-based 인덱스는 언제 사용하며, 어떤 주의사항이 있나요?
Q. 운영 중인 배치 작업이 평소 30분 걸리던 것이 갑자기 3시간 이상 소요되고 있습니다. 이 작업은 대량의 데이터를 조회하여 UPDATE하는 PL/SQL 프로시저입니다. 어떤 순서로 원인을 분석하고 해결하시겠습니까?
실행 계획 변화, 통계 정보, 락 대기, 데이터 증가량 등을 순차적으로 확인해보세요.
먼저 V$SESSION과 V$SQL을 통해 현재 실행 중인 세션의 대기 이벤트와 실행 계획을 확인합니다. AWR 리포트로 과거와 현재의 실행 계획을 비교하여 플랜 변경 여부를 파악합니다. DBMS_STATS로 테이블 통계 정보가 최신인지 확인하고, 오래되었다면 통계 수집을 수행합니다. V$LOCK과 V$SESSION_WAIT를 통해 락 경합이나 블로킹 세션이 있는지 확인합니다. 데이터 증가량을 확인하고 필요시 파티셔닝이나 병렬 처리(PARALLEL) 힌트 적용을 검토합니다. FORALL과 BULK COLLECT를 사용하여 배치 처리 성능을 개선하고, COMMIT 주기를 조정하여 UNDO 세그먼트 경합을 줄입니다.
- • V$SESSION, V$SQL로 대기 이벤트와 실행 계획 확인
- • AWR 리포트로 과거 대비 실행 계획 변화 분석
- • 통계 정보 최신화 및 락 경합 여부 확인
- • BULK COLLECT, FORALL로 배치 성능 개선
야간 배치 작업이 업무 시간까지 지연되어 서비스 장애로 이어지는 것을 방지하기 위한 긴급 대응 상황에서 활용됩니다.
Bind Variable Peeking으로 인한 실행 계획 문제는 어떻게 해결할 수 있나요?
Q. Oracle의 기본 트랜잭션 격리 수준은 무엇이며, Read Committed와 Serializable의 차이점을 Phantom Read 관점에서 설명해주세요.
Oracle의 MVCC(Multi-Version Concurrency Control) 메커니즘을 생각해보세요.
Oracle의 기본 격리 수준은 Read Committed입니다. Read Committed에서는 각 SELECT 문이 실행되는 시점의 커밋된 데이터를 읽으므로, 같은 트랜잭션 내에서 동일한 쿼리를 여러 번 실행하면 다른 트랜잭션의 INSERT/DELETE로 인해 결과가 달라지는 Phantom Read가 발생할 수 있습니다. Serializable 격리 수준에서는 트랜잭션 시작 시점의 스냅샷을 사용하므로 Phantom Read가 방지됩니다. Oracle은 UNDO 세그먼트를 활용한 MVCC로 읽기 잠금 없이도 일관된 읽기를 제공하며, Serializable에서도 읽기 작업이 쓰기 작업을 블로킹하지 않습니다.
- • Oracle 기본 격리 수준은 Read Committed
- • Read Committed는 Phantom Read 발생 가능
- • Serializable은 트랜잭션 시작 시점 스냅샷 사용으로 Phantom Read 방지
- • MVCC로 읽기-쓰기 간 블로킹 최소화
재고 관리 시스템에서 동시에 여러 주문이 들어올 때 재고 수량의 정합성을 보장하기 위해 격리 수준을 조정합니다.
FOR UPDATE 절을 사용할 때 NOWAIT과 SKIP LOCKED의 차이는 무엇인가요?
Q. PL/SQL에서 대용량 데이터를 처리할 때 CURSOR FOR LOOP 대신 BULK COLLECT와 FORALL을 사용하는 이유와 주의사항을 설명해주세요.
컨텍스트 스위칭과 메모리 사용량의 트레이드오프를 고려해보세요.
CURSOR FOR LOOP은 한 번에 한 행씩 처리하므로 PL/SQL 엔진과 SQL 엔진 간 컨텍스트 스위칭이 빈번하게 발생하여 성능이 저하됩니다. BULK COLLECT는 여러 행을 한 번에 컬렉션으로 가져오고, FORALL은 DML을 배치로 실행하여 컨텍스트 스위칭을 최소화합니다. LIMIT 절을 사용하여 한 번에 가져올 행 수를 제한하면 메모리 부족을 방지할 수 있습니다(일반적으로 1000~10000행). SAVE EXCEPTIONS 절을 사용하면 일부 행에서 오류가 발생해도 나머지 행을 계속 처리할 수 있습니다. 대용량 처리 시 주기적으로 COMMIT하여 UNDO 세그먼트 공간을 확보해야 합니다.
- • BULK COLLECT와 FORALL은 컨텍스트 스위칭을 줄여 성능 향상
- • LIMIT 절로 메모리 사용량 제어 필요
- • SAVE EXCEPTIONS로 부분 실패 처리 가능
- • 주기적 COMMIT으로 UNDO 공간 관리
수백만 건의 고객 데이터를 일괄 업데이트하는 배치 프로그램에서 처리 시간을 획기적으로 단축할 수 있습니다.
AUTONOMOUS_TRANSACTION 프라그마는 언제 사용하며, 어떤 부작용이 있을 수 있나요?
Q. 애플리케이션에서 간헐적으로 'ORA-01555: snapshot too old' 오류가 발생하고 있습니다. 이 오류의 원인과 해결 방법을 설명해주세요.
UNDO 세그먼트의 역할과 장시간 실행되는 쿼리의 관계를 생각해보세요.
ORA-01555는 긴 시간 실행되는 쿼리가 읽기 일관성을 위해 필요한 UNDO 데이터가 다른 트랜잭션에 의해 덮어써졌을 때 발생합니다. 쿼리 시작 시점의 데이터를 재구성하기 위해 UNDO 세그먼트를 참조하는데, UNDO_RETENTION 시간보다 쿼리가 오래 걸리거나 UNDO 테이블스페이스가 부족하면 발생합니다. 해결 방법으로는 UNDO_RETENTION 파라미터를 증가시키고, UNDO 테이블스페이스 크기를 확대하며, AUTOEXTEND를 활성화합니다. 장시간 실행되는 쿼리를 튜닝하여 실행 시간을 단축하고, 불필요한 COMMIT을 제거하여 UNDO 생성을 줄입니다. 배치 작업 시 CURSOR를 사용할 때는 LIMIT 절로 처리량을 제어하여 실행 시간을 분산시킵니다.
- • UNDO 데이터가 필요한 시점에 이미 덮어써져서 발생
- • UNDO_RETENTION 증가 및 UNDO 테이블스페이스 확대
- • 장시간 쿼리 튜닝으로 실행 시간 단축
- • 배치 처리 시 LIMIT으로 실행 시간 분산
대용량 리포트 생성 중 다른 사용자의 데이터 변경으로 인해 리포트가 실패하는 상황을 방지하기 위해 UNDO 관리가 필요합니다.
UNDO 테이블스페이스와 TEMP 테이블스페이스의 역할 차이는 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!