데이터베이스

DONGJIN IM·2022년 7월 14일
0

면접준비

목록 보기
8/8

Database

데이터베이스란?

여러 사람들이 사용할 목적으로 통합 관리되는 데이터들의 모임이다.

DBMS(데이터베이스 관리 시스템)이란?

여러 사람들이 데이터베이스의 데이터에 접근할 수 있도록 해주는 소프트웨어들을 의미한다.

DB를 사용하는 이유

DBMS를 활용하기 이전에는 파일 시스템을 이용하여 데이터를 관리했다.
파일 시스템이라는 것은 데이터를 파일 형식으로 저장하고, 데이터를 활용할 때 응용 어플리케이션을 활용하여 파일 형식의 데이터를 꺼내오는 방식을 의미한다.

그런데 이 경우 데이터 중복이나 데이터 불일치 문제가 발생하게 된다.
데이터 불일치 문제는 파일을 수정하는 도중 해당 파일을 불러오면 동기화 문제가 발생하여 데이터가 불일치하는 문제를 의미한다.

이런 한계를 보완하기 위하여 DB를 활용하게 되었다

데이터베이스 성능

데이터베이스는 "데이터를 저장하는 공간"이기 때문에, 디스크 I/O를 어떻게 줄이느냐에 따라 성능 향상이 발생한다.

디스크 I/O는 디스크 드라이브에서 데이터를 찾을 때, 데이터가 저장된 위치로 데이터 헤더를 이동하여 읽어오는 시간을 의미한다.

기본적으로 대부분 I/O 작업이 랜덤 I/O이지만, 랜덤 I/O는 시간이 오래 걸린다. 따라서, 이를 최대한 순차 I/O, 즉 헤드가 많이 움직이지 않게 하는 것이 데이터베이스 성능을 올리느 길이다

DB Pool

DB Connection Pool Manager가 Connection을 유지하고 있다가, 요청이 들어올 경우 커넥션을 할당해주고 없으면 기다리게 하는 것이다.
요청한 Client는 Connection을 가져가서 DB를 활용하다 다 쓰면 다시 Pool에 반납하는 식으로 활용된다.

DB Pool을 활용하지 않는다면 계속해서 DB에 연결해야 하는 과정이 선행되어야 하는데, 이는 매우 비싼 Cost 연산이다. DB Pool은 이런 비싼 연산을 수행하지 않고 Connection을 가져오기만 하면 되므로 더욱 빠른 DB 접속이 가능하며, DB Connection 수를 제한함으로써 과도한 접속으로 인한 서버 자원 고갈 방지가 가능하고, 유지 보수가 쉬워진다.

Key 종류

기본키, 후보키, 대체키, 외래키가 존재한다.


Index

Index란?

추가적은 쓰기 작업과 저장공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다
DB에서 모든 데이터를 직접 검색하면 시간이 오래 걸리는데, 인덱스를 통해 데이터 위치를 찾고, 해당 포인터로 이동하여 데이터를 가져오면 더욱 빠르게 데이터에 접근 가능해진다

Index 사용하면 좋은 경우

  • 규모가 큰 테이블

  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼

  • JOIN, WHERE, ORDER BY에 자주 활용되는 컬럼

  • 데이터의 중복도가 낮은 컬럼

Primary Index, Secondary Index

Primary Index는 Index와 Record가 직접적으로 연결되어 있다.
Record를 특정해야 하므로, Primary Key를 활용하여 Index를 생성하고, 이 값에 따라 정렬된다.

하지만, Secondary Index는 Index를 보조하는 다른 Index이다.
Primary Key 이외에 필요한 정렬 기준이 있을 경우 활용하는데, Primay Key가 아닌 다른 값으로 검색 조건을 할 때 더욱 빠르게 도와줄 수 있다

Composite Index

2개 이상의 컬럼을 합쳐 1개의 Index를 형성하는 것이다

즉, Indexing을 수행할 때 조건을 여러 개로 달아 Index를 형성하는 것이다.
이 때 Index로 설정할 컬럼 순서를 잘 정해서 첫번째 컬럼값을 통해 많은 값을 필터링할 수 있으면 더욱 빠른 접근이 가능해질 것이다

JOIN

2개의 테이블을 묶어서 원하는 데이터를 추출하는 방법이다.
INNER JOIN, OUTER JOIN, CROSS JOIN(한쪽 테이블과 다른 쪽 테이블의 Column을 모두 JOIN하는 기능), SELF JOIN(자기 자신과 JOIN하는 것) 종류가 존재한다

Index 알고리즘

B+ Tree

B Tree의 발전형이다.
B Tree는 모든 Node에 주솟값을 가지고 있기 때문에 특정 Node의 Index값과 찾는 Index값이 일치하면 바로 이동할 수 있다.
하지만, 이렇게 될 경우 중간 Node가 너무 많은 공간을 차지하게 된다.

B+ Tree는 모든 주솟값을 Leaf Node에다가만 박아 놓는다.
그리고 중간 Node에는 오직 Index값만 저장하는 것이다
따라서, Index값만 저장하기 때문에 1개의 Node에 더 많은 값을 저장할 수 있게 되며, 더욱 수월한 Search가 가능해질 것이다.

단점이라면, Root Node가 내가 원하는 Index 값이라고 해도 결국 Leaf Node까지 다다라야 내가 원하는 위치로 갈 수 있다는 점이다

B Tree

항상 정렬된 상태를 유지하여 검색 범위를 제한할 수 있다.
하지만, 정렬 트리를 유지하기 위해 삽입과 삭제할 때 정렬이 필요하다

Hash Index

정렬되어 있다고 볼 수 없다. Hashing Function을 통해 저장될 Bucket 위치를 정하기 때문에 정렬이 의미가 없다.

물론, Hashing Function에 통과시키기만 하면 되므로 빠르고, 삽입/삭제도 빠르다.
하지만 Hashing Fucntion에서 다른 값에 대해 똑같은 출력을 낸다면 똑같은 Bucket에 여러 데이터가 들어가게 되고, 이를 "충돌"이라고 한다.
충돌이 많이 발생하면 할수록 검색의 효율이 떨어진다.
또한, "이상(크거나 같다)"의 범위나 부정형 비교, 형식 비교 등에는 절대로 적용할 수 없다는 단점도 있다

Index Scan 방식

Index Range Scan

B-tree Index의 일반적이고 정상적인 형태의 액세스 방식이다.
Root에서 Leaf Block까지 수직적 탐색을 하고, 필요한 범위만큼 수평적 탐색을 하는 방식이다.

Index Full Scan

인덱시 Leaf Block 처음부터 끝까지 수평적으로 탐색하는 방식으로, 데이터 검색을 위한 최적 Index가 없을 경우 선택하는 방식이다

Index Unique Scan

수직적 탐색으로만 데이터를 찾는 스캔 방식으로, 범위가 아닌 '=' 조건에 대한 Query일 경우 활용된다

Index Skip Scan

Root 또는 Branch Block에서 읽은 컬럼 값 정보를 이용하여 조건절에 부합하는 레코드일 가능성이 존재하는 Leaf Block만 엑세스 하는 것이다.

Index Full Scan에서 가능성 있는 블록만 액세스 하는 방식이다.


정규화

정규화란?

이상(Anomaly)이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다.

정규화 장단점

가장 큰 장점은 Anomaly 현상이 많이 줄어든다는 것이다.
데이터의 일관성 유지가 한결 쉬워지며, 데이터 모델이 단순해진다.
무결성 제약조건을 만족시키기 위해 필요한 코드 양이 감소되어 응용 프로그램에서 무결성에 대해 검사하는 코드가 줄어들 것이다

분해가 많이 진행된다는 것은 JOIN 명령어가 많이 발생한다는 의미이며, 이런 이유로 질의에 대한 응답시간이 느려질 수도 있다.
또한 동일한 의미의 일반 속성이 1개의 테이블에만 나오기 때문에 1개 테이블의 데이터 용량이 최소화되어 공간 낭비가 심해질 수 있다.
따라서, 가끔 반정규화를 통해 어느정도 Anomaly를 감수하고 성능을 올리기도 한다.

정규화 종류

1NF(컬럼이 1개의 값만을 가짐), 2NF(부분적 종속이 없음. 즉, 기본키의 부분집합이 결정자가 되어선 안된다), 3NF(이행 종속성이 없어야 함), BCNF(모든 결정자가 후보키 집합에 속해야 함), 4정규화와 5정규화가 존재하지만 4정규화 이상을 수행하면 정규화 단점이 나타날 수도 있어 많이 활용하지는 않는 것으로 알고 있다

Anomaly란?

삽입 이상(Insertion) Anomaly

Tuple을 삽이할 때 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
나는 (이름, 성별)만 입력하고 싶은데, 테이블이 (이름, 성별, 주민번호)를 요구해서 주민번호에 NULL값을 넣어 삽입해야 한다.

삭제 이상(Deletion) Anomaly

튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
운영체제 수업을 듣는 A라는 사람이 수강 취소를 했다. 따라서, 데이터를 삭제했는데 문제는 A는 운영체제 수업만 들었기 때문에 해당 데이터를 삭제해버리면 A라는 사람의 정보또한 동시에 삭제되는 것이다

갱신 이상(Update Anomaly)

튜플 갱신 시 중복된 데이터 일부만 갱신되어 일어나는 데이터 불일치 현상
점수를 90점 맞은 A라는 사람이 개명을 해서 B로 바뀌었다. 이 때, 점수를 통해서 Search하여 A라는 사람을 발견했을 때, 다른 과목에는 아직도 A라는 이름으로 점수가 기록되어 있을 것이다. 따라서, 이런 부분에 대해 모두 Search하여 A라는 사람을 찾아야 한다.


트랜잭션

트랜잭션이란?

데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위이다.
한꺼번에 모두 수행되어야 할 일련의 연산을 말한다.

트랜잭션의 특성

  • 원자성
    트랜잭션 연산은 모두 반영되거나 전혀 반영되지 않아야 한다

  • 일관성
    트랜잭션이 성공적으로 실행을 완료했을 때 데이터베이스 상태는 이전과 같은 상태여야 한다.

  • 독립성
    2개 이상의 트랜잭션이 동시에 병행 실행될 경우 다른 트랜잭션 연산이 끼어들 수 없다

  • 영속성
    성공적으로 완료된 트랜잭션은 영구적으로 DB에 반영되어야 한다.

트랜잭션 상태

활동(Active) : 트랜잭션이 실행중인 상태

실패(Faield) : 트랜잭션 실행에 오류가 발생하여 중단된 상태

철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태

완료(Commited) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

Locking

여러 사용자가 동일한 시간에 동일한 데이터를 동시에 액세스할 수 있게 해주는 것이다.
트랜잭션을 순차적으로 처리되도록 함으로써 손실된 업데이트를 방지하는데 중요한 역할을 하며, 잠금을 통해 일관성 유지 및 도잇 사용이 가능하다.

트랜잭션 격리 수준

동시에 여러 트랜잭션이 실행될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다.


NoSQL

RDBMS와 NoSQL

RDBMS는 관계형 데이터 모델을 기초로 두어 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스이다
RDBMS는 테이블 간 관계에서 외래 키를 활용한 JOIN이 가능하다.

NoSQL은 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미한다.
NoSQL은 테이블 간 관계를 정의하지 않으므로 JOIN도 불가능하다.

NoSQL은 데이터 일관성은 포기하되, 구조가 정해져있지 않으므로 확장성이 뛰어나고, 분산 저장도 매우 쉬워진다.

NoSQL 종류

  • Key-Value Database
    Redis가 대표적이며, Value에 접근하기 위해 Key를 입력하는 형식이다. Value의 데이터 형식은 자유로우며 간단한 API를 제공하는 만큼 질의 속도가 매우 빠르다

  • Document Database
    Key-Document Database이다. Key-value와 다른 점은 Value가 계층 형태의 Document로 저장된다는 것이다
    객체지향에서 객체와 유사하며, Document는 1개의 단위로 취급되어 한꺼번에 저장된다.
    검색에 최적화되어 있으며 질의 결과 JSON이나 XML 형태로 출력된다는 특징을 가진다.
    MongoDB가 대표적인 예이다.

  • Wide Column Database
    Column-Family Model 기반의 Databse이다. 키는 Row, Column-family, Column-name을 가지며 이 3개를 통해 질의를 수행하여 Value를 꺼내온다.
    Attribute가 계층적인 구조를 가지고 있는 데이터베이스이다.

  • Graph Database
    데이터를 Node, Edge, Propety와 함께 그래프 구조를 사용하여 데이터를 표현하고 저장하는 Databse이다.
    연관 데이터를 추천해주는 추천 엔진, 패턴 인식이나 소셜 네트워크에 적합하다.


Optimizer

Optimzier란

가장 효율적인 방법으로 SQL을 수행할 최적 처리 경로를 생성해주는 DBMS의 핵심 엔진이다.

개발자가 SQL을 작성하고 실행하면 Optimizer에서 실행 계획을 세우고, 시스템 통계정보를 활용하여 예상 비용을 산정하여 최소 효율을 가진 실행 엔진을 도출하여 SQL Query를 실행한다

Opimizer 종류

규칙 기반 옵티마이저, 비용 기반 옵티마이저가 존재한다.

규칙 기반 옵티마이저는 사전에 정의된 규칙에 기반하여 실행 계획을 세운다.
규칙 기반 옵티마이저는 Index의 우선순위가 가장 높으며, Ranking(실행 우선 순위)에 따라 실행을 시킨다.
판단이 Rule Base이므로 규칙적이므로 예상이 가능하지만, 사용자 SQL 작성 숙련도가 높아야 한다.

비용 기반 옵티마이저는 최소비용 계산 실행계획을 수립하여 실행 계획을 세운다.
액세스 비용(Cost)를 기준으로 결정하며, User와는 독립적으로 옵티마이저 예측 성능이 Optimizer의 성능을 좌우한다.

profile
개념부터 확실히!

0개의 댓글