[인턴십] RDBMS 관련 주제

    트랜잭션

    • 트랜잭션 로그와 .ldf 파일
    • WAL
    • Replication과 자동 복구(recovery)
    • RDBMS가 트랜잭션을 보장하는 방법
      • 체크포인트
    • 그래서 Delayed Durability는 유실위험이 존재한다.
      • Lazy Writer
    • 트랜잭션의 롤백
      • 오류 종류에 따라 (제약조건 위반은 롤백되지 않는다?)
      • XACT_ABORT를 사용하는 이유
      • ROLLBACK 명령은 모든 상위 트랜잭션을 롤백한다.

    트랜잭션 격리수준

    • READ_UNCOMMITTED/READ_COMMITTED/REPEATABLE_READ/SERIALIZABLE 격리수준과 부작용
    • MSSQL의 SNAPSHOT 격리수준과 MVCC
    • 사실 격리수준은 S-Lock하고 관련이 있다.
      • 격리수준과 S-Lock의 유지범위
    • 우린 왜 UNCOMMITTED를 사용하나

    조인

    • NL 조인, 소트머지 조인, 해시 조인
    • 세미조인과 안티세미조인

    데이터베이스 인터널

    • 스레드 기반(ms) vs 프로세스 기반(oracle)
    • 스케줄러와 스레드 풀
      • 자원을 대기하는 waiting queue
      • 워커 스레드를 대기하는 큐
        1. Running: 태스크가 CPU를 점유하여 실행 중.
        2. SUSPENDED(Resource Wait): 필요한 자원(락, 래치 등)이 없어 대기 큐에서 대기.
        3. RUNNABLE(Signal Wait): 자원이 확보되어 CPU 스케줄러 큐에서 CPU 할당을 기다림.
        4. Waiting for Worker Thread: 워커 스레드가 부족하여 THREADPOOL 대기 큐에서 대기.
      • 태스크 처리 상태
    • 자주 사용하는 데이터는 캐싱하자
      • 버퍼풀
      • Logical I/O와 Physical I/O
      • Buffer Cache Hit Ratio
      • LRU
    • 경합이라고요? 나는 Lock을 사용한 적이 없는데요?
      • DBMS 내부 컴포넌트를 공유하기 위한 액세스 규칙(직렬화)
      • Latch
    • 액세스 패턴
      • 랜덤 I/O와 시퀀셜 I/O
      • 싱글 블록 I/O와 멀티블록 I/O
    • 자주 사용하는 쿼리는 캐싱하자
      • 스토어드 프로시저와 PreparedStatement
        • PreparedStatement가 동작하는 방식
        • DBMS에 따라 다른 지원(MySQL vs MSSQL)
      • 소프트 파싱 vs 하드 파싱
    • 데이터베이스의 정체는 파일이다.
      • 파일 구조
      • PFS, GAM, SGAM, IAM
      • 할당 단위의 익스텐트와 실제 데이터를 저장하는 페이지
    • MVCC를 구현하는 방법 (MySQL vs MSSQL)
      • Undo Tablespace
      • Snapshot
    • Replication
      • MySQL의 binLog
      • Master-Slave 구조의 복제
      • Replication 동작 흐름
      • 결과를 보낼까, 연산을 보낼까? (ROW, STATEMENT, MIXED)
    • Auto Recovery
      • MySQL의 리두 로그
    • 페이지 분할(Split)을 조심해라
      • 빠르게 커지는 테이블의 부하를 줄이는 방법
        • fill factor
      • 단편화
        • REORAGNIZE, REBUILD
    • IDENTITY 컬럼
      • Identity와 Right Most Problem
      • Identity 컬럼의 경합
    • DBMS가 사용자의 요청을 처리하는 방법
      • DB 엔진[파서 → Validator → Optimzer] + 스토리지 엔진
    • Optimizer
      • 규칙 기반 vs 비용 기반
      • 실행계획
      • 통계정보
        • Density Volume
        • 히스토그램과 샘플링
      • 통계가 없는 콜드 스타트에선 어떻게 동작할까?
      • 제약조건은 Optimizer에게 큰 도움이 된다.
      • 옵티마이저 힌트
    • 디스크에 읽고쓰기
      • 데이터 파일을 여러개로 나누자.
      • .mdf와 tempdb 디스크를 나누자
      • tempdb 파일을 8개로 생성하는 이유는?
      • Flush
      • Flush가 일어나는 시점
    • 인덱스가 없는 테이블?
      • 힙(Heap)
      • 넌-클러스터드 인덱스가 존재하는 힙
      • 힙은 왜 필요할까
      • RID가 뭐예요?
      • RID Lookup
    • 파티셔닝
      • 파티션 프루닝
    • IN은 조심해서 사용해라.
      • IN과 EXISTS의 차이

    인덱스

    • B-Tree 구조
    • 클러스터드 인덱스와 넌-클러스터드 인덱스
      • PK와 클러스터드 인덱스는 다르다.
      • 클러스터드 인덱스의 리프노드엔 데이터가 있다.
      • 정렬
        • 클러스터드 인덱스가 범위검색에 좋은 이유
    • 액세스 패턴
      • 랜덤 I/O와 시퀀셜 I/O
        • SSD와 HDD의 특징
        • SSD 시퀀셜 액세스는 왜 빠를까?
      • Full Scan
      • Clustered Index Seek
      • Non-Clustered Index Seek
      • Index Range Scan
    • Seek 보다 Scan이 빠르다고?
      • IAM(또는 익스텐트맵)을 사용하는 Scan

    인덱스 생성/튜닝

    • 조건절에 많이 나타나는 컬럼을 인덱스 선행 컬럼으로 만들어라
    • ‘=’은 최고의 선택
    • 선택도와 카디널리티
    • INCLUDE와 FILTERED 인덱스
      • 커버링 인덱스
      • Lookup은 비싸다
    • 몇 가지 일반적인 인덱스 전략
    • 인덱스 컬럼 순서
      • Order by, Group By
      • 선행 컬럼이 ‘=’이면 없어도 돼

    Lock

    • x-lock과 s-lock, u-lock
    • Intent Lock은 왜 필요할까?
    • Lock은 어디에 걸릴까?
      • Lock을 표시하는 위치
      • 레코드 락, 페이지 락, 테이블락
      • Lock Escalation
    • 흔하게 발생하는 데드락 사례
      • 해결방법
        • 일관된 자원의 사용순서가 중요한 이유

    댓글