질문
- RDBMS와 NoSQL의 차이점은?
- RDBMS와 NoSQL은 언제 사용하는가?
- 파티셔닝이란?
- 데이터베이스 샤딩이란?
- 분할 기법들에는 어떤것이 있는지?
- Scale up과 Scale out의 차이점은?
- RDBMS에서 scale out이 어려운 이유는?
- 클러스터링이란?
- 리플리케이션이란?
- 데이터베이스 트랜잭션이란?
- 데이터베이스 트랜잭션의 성질 ACID에 대해 설명해보시오
- DB Lock이란? 그 종류는?
- OLTP와 OLAP란?
- 인덱스란? 그 종류는?
- 인덱스를 사용할 시 단점
- 인덱스는 언제 사용해야하는가?
- DB 정규화란?
- DB 정규형의 종류는?
- Key의 종류와 각 특징은?
- 정규화를 하는 이유는?
- 이상현상의 종류는?
- 역정규화를 하는 이유는?
- DB 튜닝이란?
- DB 튜닝의 종류는?
- SQL 문장 종류는?
- Select 쿼리의 수행 순서는?
- 높은 트래픽을 어떻게 대비할 것인가?
답변
Q) DBMS란?
DBMS는 데이터베이스 관리 시스템의 약자로 데이터의 집합인 데이터베이스를 관리하고 운용하는 응용 프로그램의 집합니다.
Q) RDBMS와 NoSQL의 차이점은?
RDBMS는 관계형 데이터베이스 관리 시스템을 의미하며 모든 데이터는 중복이 없고 정확한 스키마를 따르는 2차원 테이블 형태로 저장, 관리됩니다. 그렇기 때문에 데이터의 구조와 정합성을 보장할 수 있으나 scale out이 어렵습니다.
그에비해 NoSQL은 각 데이터의 관계, 스키마와 관련 없이 key-value 값으로 데이터를 관리합니다. 그 덕분에 자유로운 데이터 관리와 scale out이 가능하지만 데이터 중복이 생길 수 있으며 중복된 데이터가 변경될 경우 모든 컬렉션에서 수정을 진행하여야합니다.
*정합성: 데이터가 서로 모순 없이 일관되게 일치
Q) RDBMS와 NoSQL은 언제 사용하는가?
RDBMS는 데이터 무결성을 만족하기 때문에 관계를 맺고있는 데이터가 자주 변경이 이루어지는 시스템에 적합합니다.
NoSQL은 그와 반대로 데이터의 update는 자주이루어지지 않는 데이터에 사용하는게 좋으며, scale out이 가능하다는 장점을 이용하여 빅데이터와 같은 분야에서 사용됩니다.
Q) 파티셔닝이란?
데이터베이스의 크기가 너무 커지게되면 용량의 한계와 성능의 저하를 초래할 수 있습니다. 이러한 문제점을 해결하기위해 데이터베이스를 파티션이라는 작은 단위로 나누는 것을 파티셔닝이라고합니다. 파티셔닝을 통해 물리적인 데이터 분할이 있더라도 application은 그 것을 알아차리지 못한다는 것이 특징입니다. 파티셔닝을 통해 성능과 가용성, 그리고 관리 용이성이 향상되지만 table간의 JOIN 연산이 많아지고 table과 index를 같이 파티셔닝 해야하기에 연산 오버헤드가 발생할 수 있습니다. 파티셔닝의 종류로는 세로로 데이터베이스를 나누는 vertical partitioning과 가로로 나누는 horizontal paritioning이 있습니다.
Q) 데이터베이스 샤딩이란?
데이터베이스 샤딩은 horizontal paritioning과 동일한 개념으로 테이블을 가로로 나누는 것을 의미합니다. 샤딩을 적용한다면 scale out 가능, 특정 query 성능 향상, 장애 전파 억제와 같은 장점이 있지만, 프로그래밍, 운영적인 복잡도는 더 높아지는 단점이 있습니다. 그렇기 때문에 서버 확장을 위해서는 scale up, read 부하 저하를 위해서는 cache 활용, table의 일부 칼럼만 자주 활용한다면 vertical partitioning 등 sharding을 피하거나 지연시켜야합니다. 또한 샤딩을할 때 고려해야할 것은 데이터가 한 쪽 샤드로 몰릴 경우(Hotspot), 샤딩이 무의미 해지기 때문에 균일하게 데이터베이스를 분산하는 것이 중요합니다.
Q) 분할 기법들에는 어떤것이 있는지?
- 범위 분할: 분할 키 값이 범위 내에 존재하는지 확인하는 방법입니다.
- 목록 분할: 값 목록에 파티션을 할당하고, 분할 키 값을 그 목록에 비추어 파티션을 선택하는 방법입니다.
- 해시 분할: 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정하는 방법입니다.
- 예) 4개의 파티션으로 나뉘는 경우 해시 함수는 0-3의 정수를 돌려줍니다
- 합성 분할: 위의 분할 방법들 중 하나를 선택합니다.
Q) Scale up과 Scale out의 차이점은?
두 방식 모두 서버의 한계에 도달했을 때 서버를 확장시키는 방식을 뜻합니다.
Scale up은 기존의 서버보다 더 높은 사양의 서버로 서버를 교체하는 방식이며 scale out은 비슷한 사양의 서버를 추가하여 인프라를 확장시키는 방식입니다. Scale up은 추가적 연결이 필요 없기 때문에 더 쉬운 방식이나 비용이 많이 발생하고 성능 확장에 한계가 있습니다. Scale out은 비용이 비교적 저렴하고 지속적 성능 확장이 가능하지만 관리가 어렵습니다.
Q) RDBMS에서 scale out이 어려운 이유는?
Scale out을 한다는 의미는 한 데이터베이스에 있는 데이터들을 특정한 기준으로 쪼갠다는 의미를 가집니다. RDBMS는 관계형 데이터베이스 관리 시스템으로 테이블들간의 관계가 중요한 역할을 하기에 데이터를 쪼개는 기준을 설정하기가 복잡해집니다. 그러나 NoSQL은 한 key에 대한 데이터를 모두 value에 담고있기 때문에 다른 데이터를 참조할 필요가 없어 그저 key 기준으로 나누면 됩니다.
Q) 클러스터링이란?
클러스터링이란 여러 개의 DB를 수평적인 구조로 구축하는 방식입니다. 클러스터링은 분산 환경을 구성하여 Single point of failure와 같은 문제를 해결할 수 있는 Fail Over 시스템을 구축하기 위해서 사용됩니다. 클러스터링은 동기 방식으로 노드들 간의 데이터를 동기화하며 그 종류로는 모든 서버를 active로 두는 active-active와 서버를 하나만 운용하고 나머지는 standby로 두는 active-standby가 있습니다. Active-active는 서버 하나가 다운될 시 서비스 중단이 없으나 비용이 많이 들고 active-standby는 비용은 적으나 active 서버가 다운될 시 standby 서버를 전환하는 시간이 듭니다.
Q) 리플리케이션이란?
리플리케이션이란 여러개의 DB를 수직적인 구조로 구축하는 방식입니다. 리플리케이션에서 master node에는 쓰기만, slave node에는 읽기만을 처리합니다. 통계적으로 DB 요청의 60%~80%는 읽기 요청이기 때문에 읽기 요청만을 처리하는 slave node를 둠으로써 부하를 분산시킬 수 있습니다. 그러나 slave node는 비동기 방식으로 master node와 동기화하기 때문에 일관성에 문제가 생길 수 있습니다.
Q) 데이터베이스 트랜잭션이란?
트랜잭션은 작업의 완전성을 보장해주는 작업 방식입니다. 작업들을 모두 처리하여 commit하거나 처리하지 못할 경우 이전 상태로 rollback하여 작업의 일부만이 적용되지 않도록 합니다.
Q) 데이터베이스 트랜잭션의 성질 ACID에 대해 설명해보시오
- 원자성 (atomicity): 작업이 모두 반영되던지 전혀 반영되지 않던지 둘 중 하나의 경우여야합니다.
- 일관성 (consistency): 실행이 완료된 후에는 일관성 있는 DB상태가 되어야합니다.
- 독립성 (isolation): 트랜잭션들은 서로 수행 중인 연산에 끼어들거나 값을 참조할 수 없습니다.
- 영속성 (durability): 완료된 결과는 영구적으로 반영되어야합니다.
Q) DB Lock이란? 그 종류는?
DB Lock이란 여러개의 트랜잭션이 하나의 데이터에 동시에 접근을 시도할 때 이를 제어해주는 도구입니다. 그 종류로는 읽기만을 허용하는 공유락, 읽기와 쓰기를 모두 허용하는 베타락이 있습니다.
Q) OLTP와 OLAP란?
OLTP란 OnLine Transaction Processing으로, 동시에 발생하는 다수의 트랜잭션을 서버가 처리하는 것을 의미합니다. OLTP는 현재의 데이터 처리가 얼마나 정확하고, 무결한지가 중요합니다. 그렇기 때문에 주로 데이터의 저장, 삭제, 수정 등의 실질적인 데이터를 수정하는 작업을 의미하는 용어입니다.
OLAP란 OnLine Analytical Processing으로, OLTP가 데이터 자체의 처리에 중점이 된 용어라면, OLAP는 이미 저장된 데이터를 기반하여 분석하는데 중점이 된 용어입니다. OLAP는 이미 저장된 데이터를 바탕으로 어떤 정보를 제공하는지가 중요합니다. 따라서 OLAP는 데이터가 무결하고, 정확하다는 전재를 바탕으로 고객 또는 사용자가 원하는 정보를 어떤식으로 표현하고 제공하는지를 의미하는 용어입니다.
Q) 인덱스란? 그 종류는?
인덱스란 검색속도를 향상을 위해 생성할 수 있는 자료구조입니다. 테이블 전체를 탐색하는 FTS가 아닌 인덱스에서 해당 값의 위치를 찾아서 접근한다는 점에서 책의 색인과 비슷한 기능을한다고 볼 수 있습니다. 종류로는 Hash Table과 B+ Tree가 있습니다. Hash table은 탐색 시간 속도가 O(1)으로 매우 빠르나 순차적 탐색이 불가능하다는 단점이 있고 B+ Tree는 hash table보다 탐색 속도는 느리지만 B tree의 리프노드들을 LinkedList로 연결시켜 순차적 탐색을 할 수 있습니다.
*B tree: 이진 트리를 확장해 자식 노드의 최대 숫자가 2보다 큰 트리 구조로 자식 노드의 최대 숫자 K를 지정하여 관리
Q) 인덱스를 사용할 시 단점
인덱스를 저장할 공간이 따로 필요하기 때문에 인덱스를 사용한다는 것은 검색 성능 향상을 위해 저장 성능을 어느정도 포기하는 것을 의미합니다. 또한 데이터 변경이 일어날 시 인덱스 또한 업데이트해야하기 때문에 변경이 빈번하다면 성능 처하를 초래할 수 있습니다.
Q) 인덱스는 언제 사용해야하는가?
데이터 양이 많고 데이터 변경보다 검색이 더 자주 발생할 때 사용해야합니다.
Q) DB 정규화란?
정규화 는 데이터 무결성을 유지하기 위해 잘 정의 된 방식으로 테이블을 분할하여 데이터베이스에서 중복 데이터를 제거하는 프로세스입니다.
Q) DB 정규형의 종류는?
- 제1정규형: 테이블의 칼럼이 원자값을 갖도록 분해하는 것입니다.
- 제2정규형: 제1정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해하는 것입니다.
- 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미합니다.
- 제3정규형: 제2정규형을 만족하고, 기본키가 아닌 속성이 기본키에 이행적 종속을 갖지 않도록 분해하는 것입니다.
- 이행적 종속이란 B가 A에 종속적이고 C가 B에 종속적일 때 C가 A에 종속적이 되는 것을 의미합니다.
- BCNF (Boyce Codd Normal Form): 제3정규형을 만족하고, 모든 결정자가 후보키가 되도록 하는 것을 의미합니다.
Q) Key의 종류와 각 특징은?
- 슈퍼키: 유일성을 만족하는 키입니다. 즉, 이 슈퍼키를 이용하면 중복 값 없이 각 데이터가 구별이 될 수 있게 되는 키입니다.
- 복합키: 두개 이상의 속성을 사용한 키입니다.
- 후보키: 유일성과 최소성을 만족하는 키입니다. 즉, 슈퍼키들 중 최소한의 갯수의 속성을 가진 키들의 집합이며 이들은 모두 기본키가 될 수 있는 후보입니다.
- 기본키: 후보키들 중 선택된 하나의 키로 오직 테이블에서 오직 하나만 지정할 수 있으며 중복값, NULL값들을 허용하지 않습니다.
- 대체키: 후보키들 중 기본키로 선택되지 못한 키들입니다.
- 외래키: 두 테이블을 서로 연결해주는 key로 NULL이거나 부모 테이블의 기본키값이여야합니다.
Q) 정규화를 하는 이유는?
데이터 변경 시 발생하는 이상 현상을 줄일 수 있고 데이터베이스 구조 확장시에 재디자인을 최소화합니다. 또한 중복 값을 제거하기 때문에 저장 공간을 절약할 수 있습니다.
Q) 이상 현상의 종류는?
- 삽입 이상: 데이터를 삽입할 때 특정 속성에 값이 없어 NULL을 입력하게되는 경우입니다.
- 갱신 이상: 중복된 데이터 중 일부만 변경하여 데이터 모순이 일어나는 경우입니다.
- 삭제 이상: 어떤 정보를 삭제할 때 의도하지 않은 다른 정보까지 삭제하게되는 경우입니다.
Q) 역정규화를 하는 이유는?
정규화로 인한 릴레이션 분해로 인하여 릴레이션 간의 join연산이 많아지며 이로인해 응답시간이 느려질 수 있습니다.
Q) DB 튜닝이란?
DB 튜닝이란 DB 구조, DB 자체, 운영체제등을 조정하여 DB 시스템의 전체적인 성능을 개선하는 작업을 의미합니다.
Q) DB 튜닝의 종류는?
- 1단계 DB 설계 튜닝: DB 설계 단계에서 성능을 고려하여 설계하는 것입니다. 데이터 모델링, 인덱스 설계, 테이블 스페이스 설계 등이 포함됩니다.
- 2단계 DBMS 튜닝: 성능을 고려햐여 메모리 혹은 블록 크기를 지정하는 것입니다. CPU, 메모리, I/O 관점에서의 튜닝으로 예시로는 Buffer, Cache 크기 등을 지정하는 것이 있습니다.
- 3단계 SQL 튜닝: SQL 작성시 성능을 고려하는 것이며 hash, join등을 사용합니다.
Q) SQL 문장 종류는?
- DML (Data Manipulation Langague, 데이터 조작어): SELECT, INSERT, DELETE > 데이터 자체의 변형
- DDL (Data Definition Language, 데이터 정의어): CREATE, ALTER, DROP, RENAME > 데이터 구조의 정의
- DCL (Data Control Language, 데이터 제어어): GRANT, REVOKE > 데이터베이스 접근에 관한 권한
- TCL (Transaction Control Language, 트랜젝션 제어어): COMMIT, ROLLBACK, ACK > 논리적인 작업의 단위를 묶어서 DML에 의해 조작된 결과를 트랜잭션별로 제어
Q) Select 쿼리의 수행 순서는?
FROM, ON, JOIN > WHERE, GROUP BY, HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
우선 FROM, ON, JOIN을 사용하여 사용할 릴레이션들을 파악합니다.
그 후 WHERE, GROUP BY, HAVING등을 사용하여 각 열에 대한 쿼리를 진행합니다.
이 모든 것이 수행 된 후 SELECT가 수행되며, SELECT 수행 이후에 DISTINCT, ORDER BY, LIMIT 순으로 선택 된 데이터 중 중복 값, 정렬, 제외할 값들에 대한 처리를 진행합니다.