트랜잭션
- 트랜잭션 로그와 .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
- 워커 스레드를 대기하는 큐
- Running: 태스크가 CPU를 점유하여 실행 중.
- SUSPENDED(Resource Wait): 필요한 자원(락, 래치 등)이 없어 대기 큐에서 대기.
- RUNNABLE(Signal Wait): 자원이 확보되어 CPU 스케줄러 큐에서 CPU 할당을 기다림.
- 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 하드 파싱
- 스토어드 프로시저와 PreparedStatement
- 데이터베이스의 정체는 파일이다.
- 파일 구조
- 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
- 랜덤 I/O와 시퀀셜 I/O
- Seek 보다 Scan이 빠르다고?
- IAM(또는 익스텐트맵)을 사용하는 Scan
인덱스 생성/튜닝
- 조건절에 많이 나타나는 컬럼을 인덱스 선행 컬럼으로 만들어라
- ‘=’은 최고의 선택
- 선택도와 카디널리티
- INCLUDE와 FILTERED 인덱스
- 커버링 인덱스
- Lookup은 비싸다
- 몇 가지 일반적인 인덱스 전략
- 인덱스 컬럼 순서
- Order by, Group By
- 선행 컬럼이 ‘=’이면 없어도 돼
Lock
- x-lock과 s-lock, u-lock
- Intent Lock은 왜 필요할까?
- Lock은 어디에 걸릴까?
- Lock을 표시하는 위치
- 레코드 락, 페이지 락, 테이블락
- Lock Escalation
- 흔하게 발생하는 데드락 사례
- 해결방법
- 일관된 자원의 사용순서가 중요한 이유
- 해결방법
'개발' 카테고리의 다른 글
Github Actions, Jib와 캐싱을 통해 CI 최적화하기 (0) | 2025.03.21 |
---|---|
Mockito 사용 중 @Spy로 실제 객체 동작 활용하기 (0) | 2025.03.10 |
SQL에서 재귀 쿼리(CTE) 사용법 및 NOT IN vs NOT EXISTS 비교 (0) | 2025.03.10 |
속성(Property)과 필드(Field)의 차이 (0) | 2022.11.07 |
댓글