박서희연구소

[Interview] Database(데이터베이스) 본문

○ Programming [Basic]/Interview

[Interview] Database(데이터베이스)

SEOHUI PARK 2024. 2. 28. 13:44
반응형

데이터베이스의 성능

성능 이슈는 Disk I/O를 어떻게 줄이느냐에서 시작되는데, Disk I/O란 Disk Drive의 Platter(원판)를 돌려서 읽어야 할 데이터가 저장된 위치로 Disk Header를 이동시킨 다음 데이터를 읽는 것을 의미한다.

이 때 데이터를 읽는데 걸리는 시간은 Disk Header를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 Disk의 성능은 Disk Header의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다고 볼 수 있다.

  • 그렇기 때문에 순차 I/O가 랜덤 I/O보다 빠를 수 밖에 없으며, 현실에서는 대부분의 I/O 작업이 랜덤 I/O
  • 랜덤 I/O를 순차 I/O로 바꿔서 실행하는 것에서 연결지어 데이터베이스 Query Tuning은 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있음

Index란?

Index는 말 그대로 책의 맨 처음 또는 맨 마지막에 있는 색인이라고 할 수 있다.

DB Table의 모든 데이터를 검색해서 원하는 결과를 가져 오려면 시간이 오래 걸린다. 그래서 Column의 값과 해당 Record가 저장된 주소를 Key/Value의 쌍으로 Index를 만들어 둘 수 있다.

DBMS의 Index는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가하거나 삭제, 수정하는 경우 Query 실행 속도가 느려진다.

  • Index는 데이터의 저장 성능을 희생
  • 그 대신 데이터의 읽기 속도를 높임
  • Index 생성을 남발하면 데이터 저장 성능이 떨어지고 Index의 크기가 비대해져서 오히려 역효과만 불러올 수 있음

Index 자료구조

B+-Tree Index 알고리즘 : 대부분의 관계형 DB 시스템에서 Index 구조와 파일 시스템에서 메타데이터 Indexing에 널리 사용되며, B-Tree의 변형으로, 데이터의 효율적인 삽입, 삭제, 검색을 지원하며, 특히 Range Queries(범위 검색)과 Sequential Access(순차 접근)에 최적화되어 있음

 

Hash Index 알고리즘 : in-memory DB나 캐싱 시스템, Key-Value Stores같은 NoSQL DB에서 단순하고, 데이터를 빠르게 검색하기 위해 사용되는 Indexing 기법 중 하나로 Hash Table을 기반으로 하며, Key에 대한 Hash Function을 적용하여 데이터의 저장 위치를 결정하며 Equality Searches(등가 검색)에 최적화되어 있음. 하지만, 데이터의 순서나 범위 검색이 중요한 경우는 B+-Tree같은 기법이 더 적합할 수 있음

 

왜 Index 를 생성하는데 B-Tree 를 사용할까? : B-Tree는 자동으로 균형을 유지하는 균형 트리 구조로, 모든 리프 노드가 같은 레벨에 위치하기에, 모든 검색 경로의 길이가 동일하게 유지되어, 검색, 삽입, 삭제 연산이 일관된 시간 복잡도를 가짐

Normalization(정규화)

데이터 중복을 최소화하고 무결성을 향상시키며, 데이터 조작 시 발생할 수 있는 여러 문제를 방지하기 위함

다만 과도한 정규화는 쿼리의 복잡성을 즉아시키고, 조인 연산이 많아져 성능 저하를 초래할 수 있음

  1. 데이터 중복 감소 : 정규화는 테이블을 재구성하여 중복된 데이터를 제거해 데이터의 일관성을 유지하고 저장 공간을 효율적으로 사용하는데 도움이 됨
  2. 데이터 무결성 향상 : 정규화된 DB는 데이터 간의 관계를 명확하게 정의하고, 이를 통해 데이터의 정확성과 일관성을 유지하여 삽입, 삭제, 수정 시 발생할 수 있는 오류를 줄임
  3. 갱신 이상 방지 : 데이터 중복으로 인해 정보가 일관되지 않게 갱신되는 현상을 말하며, 정규화를 통해 데이터 항목이 하나의 위치에만 저장되므로, 데이터 갱신 시 일관성을 유지할 수 있음
  4. 삽입 이상 방지 : 새로운 데이터를 추가할 때 불필요한 데이터도 함께 입력해야 하는 문제를 말하며, 정규화된 구조에서는 각 정보가 적절한 테이블에 분포되어 있어 문제를 줄일 수 있음
  5. 삭제 이상 방지 : 한 정보의 삭제가 다른 중요한 정보의 손실로 이어지는 현상으로 정규화를 통해 중요 정보를 분리하여 저장함으로 한 정보의 삭제가 다른 정보에 영향을 미치 않도록 할 수 있음
  6. 쿼리 성능 향상 : DB 구조를 단순화하고, 불필요한 데이터 중복을 제거함으로 쿼리의 성능을 개선할 수 있으며, 특히 검색과 조인 연산이 많은 복잡한 쿼리의 경우 정규화된 구조가 성능 향상에 크게 기여 가능
  7. 유지 보수성 향상 : 정규화된 DB는 보다 명확한 구조를 가지고 있어 시스템의 확장, 수정 및 유지 보수에 용이하고, 데이터 구조의 변경이 필요할 때, 중복 데이터와 갱신 이상의 영향을 최소화하며 효율적인 작업 수행 가능

데이터베이스 트랜잭션이 안전하게 수행됨을 보장하는 성질

  • 원자성(Atomicity) : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장
    예) 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안됨
  • 정합성(Consistency) : 트랜잭션 처리 전과 처리 후 데이터 모순이 없는 상태를 유지하는 것을 의미
    예) 모든 계좌는 잔고가 있어야 한다면, 이를 위반하는 트랜잭션은 중단
  • 독립성(Isolation) : 트랜잭션 수행 시, 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미하며, 또한 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음
    예) 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미
  • 지속성(Durability) : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미하며, 또한 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함
    예) 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있음

Statement, PreparedStatement 비교

Statement PreparedStatement
Statement 객체는 SQL문을 실행하기 위해 사용되며, SQL문은 실행 시점에 문자열로 Statement 객체에 제공 PreparedStatement는 미리 컴파일된 SQL문을 사용하여 DB 쿼리를 실행하며, "?"를 사용한 플레이스홀더를 포함하고, 실행 전에 적절한 값으로 플레이스홀더를 채워넣어야 함
주로 SQL문이 실행 시점에 결정되는 상황에서 사용, 즉 쿼리 자체가 런타임에 동적으로 구성될 필요가 없는 경우 적합 SQL문 내에서 사용될 값들을 파라미터로 전달받아 실행 시점에 바인딩함, 이를 통해 동일한 구조의 SQL문을 여러 번 실행할 때 효율적
Statement를 사용할 때 매번 SQL문이 컴파일되므로, 반복 실행 시 성능 저하가 발생할 수 있음, 또한 SQL Injection 공격에 취약할 수 있음, 이는 사용자 입력을 직접 쿼리에 포함시킬 경우 발생할 수 있는 보안 문제 PreparedStatement는 SQL문이 미리 컴파일되고 파라미터만 실행 시점에 바인딩되므로, 반복 실행 시 Statement보다 높은 성능을 제공, SQL Injection 공격에 대한 내성이 있어 보안 측면에 더 안전

 

SQL, NoSQL 비교

SQL NoSQL
테이블 기반, 데이터는 행과 열로 구성, 테이블은 명확한 스키마에 따라 구성, 스키마는 테이블의 구조를 정의하며, 데이터 타입, 관계 등을 명시 다양한 데이터 모델을 지원(Key-Value Store, Document, Column, Graph DB 등) 각 모델은 특정 유형의 데이터 관리에 최적화
고정된 스키마, 데이터 구조는 사전에 정의, 모든 데이터는 정의된 스키마에 맞춰 저장 유연한 스키마, 데이터 구조를 사전에 정의할 필요가 없으며, 애플리케이션의 필요에 따라 데이터 구조를 동적으로 변경 가능
높은 수준의 데이터 무결성을 보장하기 위한 엄격한 규칙(외래키, 트랜잭션) 제공 관계형 DB에 비해 느슨한 데이터 무결성 규칙을 가지며, 성능과 확장성에 초점을 맞춤
수직 확장(서버의 하드웨어 성능 향상)에 초점을 맞추고 있으나, 최근에는 수평 확장을 지원하는 관계형 DB 등장 주로 수평 확장(여러 서버에 데이터 분산)을 지원하며, 대규모 데이터 세트와 트래픽을 처리하기 위해 설계
SQL을 사용하여 데이터를 쿼리하고 조작, SQL은 매우 강력하고 다양한 데이터 조작 및 질의 기능 제공 다양한 NoSQL DB마다 고유의 쿼리 방식과 API를 제공하며, SQL만큼 표준화되거나 강력하지 않을 수 있음
복잡한 질의와 트랜잭션이 필요한 은행, 금융 시스템, ERP, CRM 등에 적합 빅데이터, 실시간 웹 애플리케이션, IoT, 분산 데이터 저장소 등 대용량, 비구조적 데이터 처리가 필요한 경우 적합

 

반응형
Comments