[CS]Database관련 질문 및 답변1

Michelle Kim·2025년 3월 10일

CS-지식

목록 보기
6/15

데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명

1. DB- Index 사용이유?

  • 검색 성능 향상 위해
    조건: 해당 쿼리가 index를 사용하는지, 카디널리티, Selectivity같은 요소들이 고려된 인덱스가 생성되어야 함.

2. DB- Index 장/단점
1) 장점
- 빠른 검색 성능
2) 단점
- 인덱스 구성하는 비용(추가, 수정, 삭제 연산시) 인덱스 형성하기 위한 추가적인 연산 수행됨
=> 인덱스 생성시, 트레이드 오프 관게에 놓여있는 요소들을 종합적으로 고려하여 생성해야함.

3. Index를 잘 사용해야함! 왜?
- 인덱스 생성시, 추가적인 저장공간 필요, 인덱스 관리 위한 오버헤드가 발생할 수 있음.
- 인덱스 존재하는 경우, 데이터 삽입/수정/삭제시에도 인덱스가 함께 업데이트 됨. => 인덱스가 많아질수록, 쓰기 성능 감소 할 수 있음
- 쿼리에 사용되지 않는 인덱스 존해시, 해당 인텍스는 시스템 리소스 공간을 불필요하게 차지 => 시스템 전체 성능에 부정적인 영향 줄 수 있음
- 인덱스 관리하는 것도 비용이 듬. 인덱스가 많아지면 관리하기 어려움
=> 따라서, 인덱스 생성전에, 충분한 분석 및 검토가 필요, 시스템을 균형있게 유지해야 함.

4. DBMS 는 인덱스를 어떻게 관리하고 있는가?
1) B+-Tree 인덱스 알고리즘

  • 일반적으로 사용되는 인덱스 알고리즘은 B+-Tree 알고리즘이다.
  • B+-Tree 인덱스는 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘
    2) Hash 인덱스 알고리즘
  • 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원
  • 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다.
  • 주로 메모리 기반의 데이터베이스에서 많이 사용

5. 왜 index를 생성하는데 b-tree사용하는가?

  • 데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적일 것 같은데? SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 된다.
  • hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생
  • 동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.

트랜잭션에 대해 설명

1. 트랜잭션이란?

  • 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위
  • 수행중에 한 작업이라도 실패하면 전부 실패하고, 모두 성공해야 성공이라고 할 수 있다.
  • 트랜잭션은 작업의 완전성 을 보장해주는 것

2. 트랜잭션의 상태

  • Partially Committed: 트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 commit이전 sql문이 수행되고 commit만 남은 상태를 말한다.
  • Committed: 트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태를 말한다.
  • Aborted: 트랜잭션이 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

2-1. Partially Committed 와 Committed 의 차이점
Partial Commited는 Commit 요청이 들어왔을때를 말하며,
Commited는 Commit을 정상적으로 완료한 상태를 말한다.

3. 트랜잭션을 사용할 때 주의할 점
트랜잭션의 범위를 최소화하라. 일반적으로 데이터베이스 커넥션은 개수가 제한적이다. 그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 그러다 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있는 것

4. 교착상태란 무엇
복수의 트랜잭션을 사용하다보면 교착상태가 일어날수 있다.
교착상태란 두 개 이상의 트랜잭션이 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라고 한다.

5. 교착 상태의 빈도를 낮추는 방법

  • 트랜잭션을 자주 커밋한다.
  • 정해진 순서로 테이블에 접근한다. 위에서 트랜잭션 1 이 테이블 B -> A 의 순으로 접근했고, 트랜잭션 2 는 테이블 A -> B의 순으로 접근했다. 트랜잭션들이 동일한 테이블 순으로 접근하게 한다.
  • 읽기 잠금 획득 (SELECT ~ FOR UPDATE)의 사용을 피한다.
  • 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착상태가 발생하기 쉽다, 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화 하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.

ACID에 대해 설명

ACID : 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질
1) Atomicity(원자성) : 트랜잭션의 연산은 모든 연산이 완벽히 수행되어야 하며, 한 연산이라도 실패하면, 트랜잭션 내의 모든 연산은 실패
2) Consistency(일관성) : 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.
3) Isolation(고립성) : 트랜잭션은 동시에 실행될 경우, 다른 트랜잭션에 의해 영향받지 않고 독립적으로 실행되어야 함
4) Durability(내구성) : 트랜잭션이 커밋된 이후에는, 시스템 오류가 발생하더라도 커밋된 상태로 유지되는 것을 보장해야 함, 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

트랜잭션 격리 수준(Transaction Isolation Levels)에 대해서 설명

1) READ UNCOMMITTED: 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다.
2) READ COMMITTED: 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
3) REPEATABLE READ: 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
4) SERIALIZABLE: 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.(성능 매우 떨어짐)

정규화에 대해 설명

정규화 : 데이터의 중복방지, 무결성을 충족시키기 위해 데이터베이스를 설계하는 것을 의미

제 1 정규형
애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다.

제 2 정규형
모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X -> Y 라고 가정했을 때, X 의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

제 3 정규형
어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X - >Y, Y -> Z의 경우에 의해서 추론될 수 있는 X -> Z의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.

BCNF(Boyce-Codd) 정규형
여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다. 비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말한다.

1. 정규화는 어떤 배경에서 생겨났는가?
한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비하게 된다.
또 중복된 정보로 인해 갱신 이상이 발생하게 된다.
동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것이다. 이러한 문제를 해결하기 위해 정규화 과정을 거친다.

1-1. 갱신 이상에는 어떤것들이 있나?

  • 삽입 이상(insertion anomalies) : 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점을 말한다.

  • 삭제 이상(deletion anomalies) : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.

  • 수정(갱신)이상(modification anomalies): 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점을 말한다.

2. 정규화에는 어떤 장점이 있는가?
1) 데이터베이스 변경 시 이상 현상(Anomaly) 제거, 각종 이상 현상들이 발생하는 문제점을 해결할 수 있다.

2) 데이터베이스 구조 확장 시 재 디자인 최소화 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.

3) 사용자에게 데이터 모델을 더욱 의미있게 제공 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.

3. 단점은 없는가?

  • 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다.
  • 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.
  • 따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

4. 어떠한 상황에서 정규화를 진행해야 하는가? 단점에 대한 대응책은?
조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.

4-1. 반정규화(De-normalization, 비정규화)란?
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해
중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.

4-2. 무엇이 반정규화의 대상이 되는가?
1) 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
2) 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
3) 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

profile
🇬🇧영국대학교)Computer Science학과 졸업 📚Data, AI, Backend 분야에 관심이 많습니다. 👉Email: kimbg9876@gmail.com

0개의 댓글