[기술면접] 데이터 베이스

1. 데이터베이스 풀 (pool)

db-connection-02

장점

Thread Pool 도 있다. Thread 수가 Connection 보다 많은게 좋다고 한다.
모든 스레드가 디비 커넥션을 할 것이 아니기 때문.
스레드를 많이 사용할수록 당연히 메모리는 많이 먹는다.

2. 트랜잭션 (Transaction)

데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위 (로직 단위)

트랜잭션의 성질 (ACID)

1) 원자성 (Atomicity) ALL OR NOTING
트랜잭션의 모든 연산들은 수행 완료되거나 아니면 아예 안한 상태를 보장해야 한다.

2) 일관성 (Consistency)
트랜잭션 완료 후에도 DB는 일관된 상태를 유지해야 한다

3) 독립성 (Isolation)
하나의 트랜잭션이 실행하는 도중 변경한 데이터는, 해당 트랜잭션이 완료되기 전까지 다른 트랜잭션이 참조하지 못한다.

  1. 지속성 (Durability)
    성공적으로 수행된 트랜잭션은 영원히 반영된다.

트랜잭션의 상태

transaction-status

Isolation Level

http://www.dbguide.net/db.db?cmd=view&boardUid=148216&boardConfigUid=9&boardIdx=138&boardStep=1

  1. Read Uncommitted
    커밋도 안했는데, 바뀐 값을 읽어올 수 있다. (UPDATE 직후)

발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read

  1. Read Committed (READ 두번 할떄 한번 하고 그 중간에 UPDATE 간섭가능) 커밋이 완료된 데이터만 읽을 수 있다. 중간 간섭하는 TX2 가 커밋 되기 전에 읽으면 예전 데이터로 읽고, 커밋 후면 바뀐 데이터로 읽어온다. Dirty Read가 발생할 여지는 없으나, Read Uncommitted 수준보다 동시 처리 성능은 떨어진다.

    발생 문제점 : Non-Repeatable Read, Phantom Read

  2. Repeatable Read
    한번 읽은 값은 계속 그대로 읽는다.
    트랜잭션이 완료되기 전까지는 처음느낌 그대로 ㄱ (다른 트랜잭션이 수정 불가) 한번 읽혀졌던 데이터에 걸린 LOCK 이 계속 유지된다.

발생 문제점 : Phantom Read

  1. Serializable
    Strict 2PL 같은거

격리성 관련 문제점

  1. Dirty Read 커밋도 안된거 읽어서 롤백되면 당황하는 거

  2. Non-Repeatable Read (리드하고 있는데 남이 와서 커밋해버림)
    트랜잭션 내에서 다시 읽었는데 값이 바뀌어있음 (수정 / 삭제)

  3. Phantom Read
    없던 데이터가 생겨있음 (삽입) 트랜잭션 도중 새로운 레코드가 삽입될 수 있어서 그럼

3. 스키마 란?

191456384EA616D008

4. 조인

5. 파티셔닝

5-1) 샤딩 심화

5-2) 샤딩의 단점, 주의사항

5-3) 샤딩 참고

6. 인덱스

사용 이유 : READ FAST (검색 > 변경)

6.1. 데이터 엔트리의 정보 (리프 노드)

ALTERNATIVE 1 :
search key k를 포함하는 실제 데이터 레코드 (인덱스 파일 구성)
heap, sorted 파일 구조 대신 쓰기도 한다.

ALTERNATIVE 2 :
<k, rid of data> :
유일키일 경우 하나의 rid Primary, Unique index 라고 부른다

ALTERNATIVE 3 :
<k, list of rids of data>:
유일키가 아닐경우 rid list Secondary index 라고 부른다.

6.2. 인덱스를 이용할때 최적의 조건

6.3. Query workload

6.4. 어떤 인덱스를 쓸 것인가

https://github.com/Donsworkout/cs_wiki/blob/master/database_system/8_overview_of_storage_and_indexing.md#7-%EC%96%B4%EB%96%A4-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A5%BC-%EC%93%B8%EC%A7%80-%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0\

7. Slow Query 대처

슬로우 쿼리 로그 는 시간이 오래 걸렸던 쿼리를 로그로 저장해 놓은 것. FULL SCAN 이나 잘못된 인덱스 사용으로 발생하기도 한다.

7.1. Slow Query 원인

8. Query Optimization

일단은 평소에 DB에 관련된 최적화가 이루어져있는지 체크하는 과정이 중요하다. 가장 간단하게 할 수 있는 Query 최적화가 있습니다.

그리고 평소에 Query 실행계획을 보면서 Query를 적용하기 전에 테스트하는 과정이 필요합니다.

https://github.com/Donsworkout/cs_wiki/blob/master/database_system/12_overview_of_query_evaluation.md

8.1. 쿼리 평가

쿼리 옵티마이저는 차선의 선택을 한다. 메타데이터 업데이트가 실시간은 아니기 때문

8.2. 쿼리 최적화의 interests

1) 주어진 Query에서 어떤 plan 들이 고려되어야 하는가? 2) 각 Plan의 Cost는 얼마인지 ?

8.3. 쿼리 최적화 과정

  1. Access Path 선택
    • full scan or index!
    • prefix 조건을 확인해 보세요!
  2. 관계연산을 위한 알고리즘 선택
    • Selection
      • RF 10% 100 페이지 10000 튜플일때, 클러스터는 100 IO 지만.
        unclustered 일때는 10000 IO 발생가능, FULL SCAN 요망
      • 이런식으로 selection 어떻게 할지 생각함
      • unclustered 라면 RF 5% 이상은 풀스캔이 낫다.

9. NoSQL - 주로 MongoDB vs RDBMS

9.1 MongoDB 의 특장점

9.1.1 쓰면 좋을 상황

9.2 MongoDB 단점

9.3 MongoDB 의 지형 인덱스와 쿼리

지형 인덱스를 사용한 billRun
https://enzine.tistory.com/m/entry/MongoDB%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C

실제 사례 연구: 결제 시스템