1. 인덱스를 설명하고 장단점을 말해주세요
- 데이터베이스 테이블에 대한 검색 성능의 속도를 높여 주는 자료구조, 데이터와 데이터의 위치를 포함한 자료구조를
생성하여 빠르게 조회할 수 있도록 합니다.
장점으로는 테이블을 조회하는 속도와 성능을 향상시킬 수 있고, 시스템 부하를 줄일 수 있지만, 단점으로는 인덱스를
관리하기 위한 추가작업이 필요하고 인덱스를 잘못 사용하는 경우 오히려 검색 성능이 저하될 수 있습니다.
또한, 인덱스를 관리하기 위해 추가적인 저장공간이 필요합니다.
2. 정규화를 설명하고 장단점을 설명하세요
- 데이터의 중복을 최소화하게 데이터를 구조화하는 과정을 말합니다.
장점으로는, 각종 이상 현상들을 해결할 수 있고 무결성을 유지하며, 데이터의 일관성을 높여줍니다.
단점으로는 데이터를 조회 시 많은 JOIN을 유발하기 때문 CPU와 메모리를 많이 사용해서 응답시간이
느려질 수 있습니다.
3. 인덱스의 자료구조에는 어떤 것이 있나요
해시 테이블
해시 테이블 기반의 인덱스는 key를 데이터, value를 데이터의 위치로 사용하여 인덱스를 구현한다. 시간복잡도는 O(1)
해시 테이블 기반의 인덱스는 등호 연산에만 최적화되어있기 때문에 부등호 연산이 자주 사용되는 경우는 추가적인 순차 검색이 필요하여 빠른시간 내에 찾을 수 없다.
B+ tree
하나의 노드에 여러 데이터가 존재할 수 있고, 리프노드끼리 연결리스트로 연결되어 있다. 또한 리프노드에만 데이터가 존재한다.
등호 연산뿐만 아니라, 부등호 연산을 이용할 경우 리프노드의 연결리스트를 통해 순차 검색을 효율적으로 할 수 있다는 장점이 있다.
4. 인덱스를 사용하면 좋은 경우는?
- 삽입, 갱신, 삭제가 자주 발생하지 않는 컬럼, JOIN,WHERE,ORDER BY에 자주 사용되는 컬럼, 그리고 데이터의
중복도가 낮은 컬럼에 사용하면 좋습니다.
5. 그럼 인덱스를 효율적으로 설정하는 후보 컬럼의 4가지 기준은 뭐가 있나요?
카디널리티
전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표
ex) 주민등록번호와 같은 경우는 중복되는 값이 없기 때문에 카디널리티가 높다고 할 수 있다. 즉, 상대적인 개념
=> 카디널리티가 높을수록 인덱스 설정에 좋은 컬럼. = 한 컬럼이 갖고 있는 값의 중복 정도가 낮을 수록 좋다.
선택도(Selectivity)
데이터에서 특정 값을 얼마나 잘 선택할 수 있는지에 대한 지표 계산 방법으로는
= 컬럼의 특정 값의 row 수/ 테이블의 총 row 수 *100 = 컬럼의 값들의 평균 row 수 / 테이블의 총 row 수 *100
즉, 선택도는 특정 필드값을 지정했을 때 선택되는 레코드 수를 전체 테이블 전체 레코드 수로 나눈 것.
=> 선택도가 낮을 수록 인덱스 설정에 좋습니다.(5~10%가 적당)
활용도
해당 컬럼이 실제 작업에서 얼마나 활용되는지에 대한 값
수동 쿼리 조회, 로직과 서비스에서 쿼리를 날릴 때 WHERE 절에 자주 활용되는지를 판단하면 된다. => 활용도가 높을 수록 인덱스 설정에 좋은 컬럼
중복도
중복도가 없을 수록 인덱스 설정에 좋은 컬럼
6. 인덱스에 가장 많이 사용되는 자료구조를 말하고 이유를 설명하세요
데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적일 것 같지만, SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 된다.
hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다.
동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.
7. 이상현상의 종류에 대해 말해주세요
삭제 이상: 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
삽입 이상: 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
수정 이상: 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
7-1. 이를 해결할 수 있는 방법을 설명하세요
정규화
8. B-tree와 B+tree의 차이점을 설명하세요
B-tree
데이터 저장 : 리프 노드, 브랜치 노드 모두 데이터 저장 가능
풀 스캔 시, 검색 속도 : 모든 노드 탐색
트리의 높이 : 높음
키 중복 :없음
검색 : 자주 access 되는 노드를 루트 노드 가까이 배치할 수 있고, 루트 노드에서 가까울 경우,
브랜치 노드에도 데이터가 존재하기 때문에 빠름
링크드 리스트 : 없음
B+tree
데이터 저장 : 오직 리프 노드에만 데이터 저장 가능
트리의 높이 : 낮음(한 노드 당 key를 많이 담을 수 있음)
풀 스캔 시, 검색 속도 : 리프 노드에서 선형 탐색
키 중복 : 있음(리프 노드에 모든 데이터가 있기 때문)
검색 : 리프 노드까지 가야 데이터 존재
링크드 리스트 : 리프 노드끼리 링크드 리스트로 연결
9. 트랜잭션을 설명하고 특징을 설명하세요
데이터베이스의 상태를 변화시키기 위해 수행되는 작업단위
원자성(atomicity) : 트랜잭션이 모두 수행되었거나 되지 않았거나를 보장하는 특징
일관성(consistency) : 트랜잭션의 작업 결과가 항상 일관되어야 한다는 뜻
독립성(isolation) : 하나의 트랜잭션이 다른 트랜잭션에 끼어들 수 없다는 것
지속성(durability) : 트랜잭션이 성공적으로 완료되면 영구적으로 결과에 반영되어야 한다는 뜻
10. 격리 수준을 말하고 설명하세요
READ UNCOMMITED : 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는
문제가 있다.
READ COMMITED : 가장 많이 사용되는 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없고 커밋
완료된 데이터에 대해서만 조회를 허용한다.
REPEATABLE READ : 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을
추가하는 것은 막지 않는 것
SERIALIZABLE : 트랜잭션을 순차적으로 진행시키는 것으로, 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
11. 격리 수준에 따라 발생하는 현상 3가지를 설명하세요
팬텀 리드(phantom read) : 한 트랜잭션에서 일정 범위의 데이터를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던
데이터가 두번째 쿼리에서 나타나는 현상
반복 가능하지 않은 조회(non-repeatable read) : 한 트랜잭션에서 같은 데이터를 두 번 이상 조회 시, 그 값이 다른 경우
더티 리드(dirty read) : 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의
데이터를 읽을 수 있을 경우
12. '반복 가능하지 않은 조회' 현상과 '더티 리드' 현상의 차이점을 설명하세요.
반복 가능하지 않은 조회(non-repeatable read) : 한 트랜잭션에서 같은 데이터를 두 번 이상 조회 시, 그 값이 다른 경우
더티 리드(dirty read) : 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 경우
13. 무결성에 대해 설명하세요.
데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
14. 커밋과 롤백에 대해 설명하세요
Commit
하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산
Rollback
하나의 트랜잭션 처리가 실패했음을 알려주는 연산.
지금까지 실행한 연산의 결과가 취소되고 트랜잭션이 수행되기 전의 상태로 돌아감.
15. 트랜젝션이 필요한 이유는?
Insert, delete, update등의 데이터 변경문의 실행을 트랜잭션을 통해 관리 할 수 있으며 이를 통해 데이터베이스의 무결성과 일관성을 보장할 수 있기 때문.
16. 각 정규화 단계에 대해 설명해주세요.
제 1 정규형 : 릴레이션에 속한 모든 속성의 도메인이 원자값(Atomic Value, 하나의 값)으로 구성되어 있어야 한다.
제 2 정규형 : 제1정규형에 속해있고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되어야 한다.
제 3 정규형 : 제2정규형에 속해있고, 기본키가 아닌 모든 속성이 기본 키에 이행적 함수 종속이 되지 않아야 한다.
(이행적 종속: A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미)
BCNF 정규형 : 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다
17. 역정규화를 하는 이유에 대해 설명해주세요.
정규화를 통해 분리되었던 릴레이션에서 중복을 허용하고, 다시 통합하거나 분할하여 구조를 재조정하는 과정이다.
역정규화를 하는 이유
조인으로 인하여 성능이 저하되는 문제를 해결하기 위해 사용한다.
정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
다량의 범위를 자주 처리해야하는 경우
특정 범위의 데이터만 자주 처리하는 경우
요약/집계 정보가 자주 요구되는 경우
18. 정규화의 목적은 무엇인가요?
테이블 간에 중복된 데이터를 허용하지 않는 것
무결성을 유지할 수 있고, DB 저장 용량 또한 효율적으로 관리가 가능
19. 트랜잭션을 병행으로 처리하려고 할 때 발생할 수 있는 문제를 설명해주세요.
갱신 분실
하나의 트랜잭션이 수행한 데이터 변경 연산의 결과를 다른 트랜잭션이 덮어서 변경 연산이 무효되는 것
모순성
하나의 트랜잭션이 여러 개의 데이터 변경 연산을 실행할 때, 일관성 없는 상태의 데이터베이스에서 데이터를 가져와
연산 실행 시 모순된 결과가 발생하는 것
연쇄 복귀
병행 수행되던 둘 이상의 트랜잭션 중 어느 한 트랜잭션에 오류가 발생하여 Rollback 하는 경우 다른 트랜잭션들도
함께 Rollback 되는 현상을 말한다.
비완료 의존성 (uncommitted Dependency)
하나의 트랜잭션 수행이 실패한 후 회복하기 전에 다른 트랜잭션이 실패한 갱신 결과를 참조하는 현상을 말한다.
20. 트랜잭션을 병행으로 처리할 때 위와 같은 문제를 방지하기 위한 방법을 설명해주세요.
로킹 제어 기법(어떤 트랜잭션이 특정 DB의 데이터를 사용할 때 DB의 일정부분을 Lock시키고 트랜잭션이 완료될때 해당부분을 Unlock시키는 방법)을 사용한다.
21. 무결성 제약조건의 종류와 무결성을 유지해야 하는 이유는?
개체 무결성, 참조 무결성, 도메인 무결성, 고유 무결성, NULL 무결성, 키 무결성이 있다.
✓ 개체 무결성: 각 릴레이션의 기본키를 구성하는 속성은 널값이나 중복된 값을 가질 수 없다.
✓ 참조 무결성: 외래키 값은 NULL이거나 참조하는 릴레이션의 기본키 값과 동일해야 한다.
도메인 무결성: 속성들의 값은 정의된 도메인에 속한 값이어야 한다.
고유 무결성: 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 릴레이션의 각 튜플이 가지는 속성 값들은
서로 달라야 한다.
NULL 무결성: 릴레이션의 특정 속성 값은 NULL 될 수 없다.
키 무결성: 각 릴레이션은 최소한 한 개 이상의 키가 존재해야 합니다.
무결성이 유지되어야 DB에 저장된 값에 대한 신뢰성이 확보된다.
22. 교착 상태에 대해 설명해주세요
2개 이상의 트랜젝션이 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜젝션이 소유하고 있는 잠금을 요구하면
아무리 기다려도 상황이 바뀌지 않는 상태가 되는데 이를 교착상태라고 한다.
23. 교착상태를 방지하기 위한 방법은?
트랜잭션을 자주 커밋한다.
정해진 순서로 테이블에 접근한다
SELECT ~ FOR UPDATE의 사용을 피한다.
'CS 스터디 > 데이터베이스' 카테고리의 다른 글
SQL Injection, SQL vs NoSQL (0) | 2022.07.17 |
---|