[커널아카데미] 백엔드 12기 8주차 회고

david1-p·2025년 5월 18일

회고

목록 보기
8/27

 이번주 SQL튜닝과 HTML/CSS를 배웠다.HTML/CSS는 기존에 아는 내용이라서 쉽게 이해가능했지만, SQL튜닝 같은 경우는 처음 배우는 것이다 보니 많이 힘들었다.

  디자인패턴 스터디에서 Bridge 패턴을 발표하였는데, 디자인 패턴 대부분이 client로부터 의존성을 분리하여 안정성을 추구하는 것 같았다. 추가/변경할 사항들을 하위 클래스에 구현함으로써 상위 클래스는 변화에 영향을 받지 않는 것이다

 이번주도 열심히 공부한 것 같았지만, 순공시간은 10시간도 채 안되는 것 같았다. 순공시간을 조금더 늘려서 자바나 SQL 쪽을 더 공부해야겠다. 이제 2주 뒤부터는 프로젝트 시작이다. 다른 사람들에게 폐를 안끼치게 조금더 공부를 열심히 해야겠다. 이번 주도 고생한 나 칭찬해!


DML 튜닝 & 동시성 제어 이론 정리

데이터 변경 작업(DML)의 성능을 극대화하고, 동시성 문제를 방지하기 위한 주요 기법들을 이론적으로 정리합니다.

1. 기본 DML 튜닝

1.1. 바인드 변수 사용

  • 정의: SQL 문 내에 리터럴 대신 변수 자리(:1, :emp_id 등)를 사용
  • 효과
    • 하드 파싱 감소: 동일한 쿼리 구조가 재사용되어 라이브러리 캐시 히트 증가
    • 메모리 절감: 여러 리터럴 조합으로 인한 SQL 객체 증가 방지
  • 예시
      UPDATE employees
      SET salary = :new_salary
      WHERE employee_id = :emp_id;

1.2. 배치 처리 (Batch Processing)

  • 정의: 애플리케이션 레벨에서 다수의 DML 문을 묶어 한 번에 전송
  • 효과
    • 네트워크 왕복(latency) 최소화
    • 트랜잭션 오버헤드 절감
  • 주의점
    • 배치 크기 과도 시 UNDO/REDO 부하 증가
    • 에러 발생 시 롤백 범위 관리 필요

1.3. 인덱스 설계 최적화

  • 목표: WHERE·JOIN 절에 적절한 인덱스를 배치하여 검색 효율화
  • 유의사항
    • 인덱스 과다: DML 시마다 인덱스 유지 비용 증가
    • 컴파운드 인덱스: 다중 컬럼 검색 패턴을 고려해 순서 설계

2. Direct Path I/O 활용

2.1. APPEND 힌트

  • 정의: 버퍼 캐시를 우회하고 데이터 파일에 직접 쓰기
  • 장점
    • 하드웨어 I/O 효율 향상
    • 버퍼 캐시 오염 방지
  • 예시
      INSERT /*+ APPEND */ INTO target_table
      SELECT * FROM source_table;

2.2. PARALLEL DML

  • 정의: 프로세스를 다중화하여 DML 작업 병렬 수행
  • 설정
      ALTER SESSION ENABLE PARALLEL DML;
      INSERT /*+ PARALLEL(target_table, 8) */ INTO target_table
      SELECT * FROM source_table;
  • 유의사항
    • 시스템 리소스(CPU, I/O) 여유 확인
    • NOLOGGING 모드 함께 사용 시 REDO 부하 감소

3. 파티션을 활용한 DML 튜닝

3.1. 파티션 프루닝 (Pruning)

  • 정의: 쿼리 내 파티션 키 사용 시 불필요 파티션 스캔 제거
  • 장점
    • I/O 절감
    • 실행 계획 단순화

3.2. 파티션 익스체인지 (Exchange Partition)

  • 정의: 교체할 테이블(스테이징)과 기존 파티션을 메타데이터 수준에서 교환
  • 장점
    • 잠금 범위 최소화
    • 대용량 데이터 교체 시 다운타임 감소
  • 예시
      ALTER TABLE sales
      EXCHANGE PARTITION p_202505
      WITH TABLE staging_sales
      WITHOUT VALIDATION;

3.3. 파티션별 로컬 인덱스

  • 정의: 파티션 단위로 관리되는 인덱스
  • 효과
    • DML 시 인덱스 유지 작업 분산
    • 파티션 단위 리빌드/관리 용이

4. Lock과 트랜잭션 동시성 제어

4.1. 락 레벨 이해

  • 테이블 락(TABLE LOCK) vs 로우 락(ROW LOCK)
    • 가능한 로우 락 사용해 동시성 최대화

4.2. SELECT … FOR UPDATE

  • 정의: 조회와 동시에 대상 로우에 락 설정
  • 예시
      SELECT * FROM accounts
      WHERE account_no = :acct
      FOR UPDATE NOWAIT;
  • 효과
    • 갱신 준비 상태로 즉시 락 획득
    • 불필요 대기 시간(NOWAIT 예외 처리) 방지

4.3. 트랜잭션 격리 수준 (Isolation Levels)

격리 수준Dirty ReadNon‐Repeatable ReadPhantom Read
READ UNCOMMITTED허용허용허용
READ COMMITTED불가허용허용
REPEATABLE READ불가불가허용
SERIALIZABLE불가불가불가
  • 실무 기본: READ COMMITTED
  • 고격리 필요 시: SERIALIZABLE (교착·성능 저하 리스크 주의)

4.4. 낙관적 vs 비관적 잠금

  • 비관적 잠금: 즉시 락 → 충돌 회피
  • 낙관적 잠금: 충돌 후 검증(버전 컬럼) → 락 충돌 가능성 낮은 환경에 적합
profile
DONE IS BETTER THAN PERFECT.

0개의 댓글