데이터베이스
- 데이터 베이스의 특징 : 독립성, 무결성, 보안성, 일관성, 데이터 중복 최소화
- 데이터베이스의 성능
- 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다고 볼 수 있다.
- 그렇기 때문에 순차 I/O가 랜덤 I/O 보다 빠를 수밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O이다.
- 랜덤 I/O를 순차 I/O로 바꿔서 실행할 수는 없을까? 이러한 생각에서부터 시작되는 데이터베이스 쿼리 튜닝은 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다.
INDEX
- DBMS가 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 시간이 오래 걸려서 컬럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 두는 것이다.
- Index 자료구조
- B+ Tree 인덱스
- 일반적으로 사용되는 인덱스 알고리즘은 B+ Tree 알고리즘이다.
- 칼럼의 값을 변형하지 않고, 원래의 값을 이용해 인덱싱하는 알고리즘이다.
- Hash 인덱스
- 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다.
- 값을 변형해서 인덱싱 하므로, 특정 문자로 시작하는 값으로 검색하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다.
- 주로 메모리 기반의 데이터베이스에서 많이 사용한다.
- 왜 인덱스를 생성하는데 B Tree를 사용하나?
- SELECT 질의의 조건에는 부등호 연산도 포함이 된다. 해시 테이블을 사용하게 된다면 등호 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. 동등 연산에 특화된 해시테이블은 데이터베이스의 자료구조로 적합하지 않다.
- 클러스터드 인덱스
- 테이블의 프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것이다. 프라이머리 키 값에 의해 레코드의 저장 위치가 결정된다.
- WHERE 절에 자주사용되거나 외래키를 사용하거나 Join에 자주사용되는 컬럼에 사용하면 좋다. 데이터의 중복도가 높거나 DML이 자주 일어나는 컬럼에는 사용하지 않는 것이 좋다.
정규화
- 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업이다. 데이터 구조의 안정성 및 무결성을 유지한다. 이상 현상도 최소화한다.
- 이상현상 (Anomaly)
- 삽입 이상 : 원하지 않는 자료가 삽입된다든지, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생한다.
- 삭제 이상 : 정보 삭제 시 원치 않는 다른 정보가 같이 삭제되는 경우 발생한다.
- 갱신 이상 : 중복 데이터 중에서 특정 부분만 수정되어 중복된 값이 모순을 일으키는 경우 발생한다.
- 제 1 정규형 : 릴레이션에 속한 모든 속성값은 원자 값을 가지고 있어야 한다.
- 제 2 정규형 : 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족한다.
- 제 3 정규형 : 기본키가 아닌 모든 속성이 기본키에 대해 이행적 종속을 만족하지 않는 정규형이다.
- BCNF 정규형 : 결정자가 모두 후보키인 정규형이다.
- 제 4 정규형 : 다치 종속 A ->> B가 성립하는 경우 릴레이션의 모든 속성이 A에 함수적 종속 관계
- 제 5 정규형 : 릴레이션의 모든 조인 종속이 후보키를 통해서만 성립되는 정규형이다.
- 함수적 종속이란?
- 데이터들이 어떤 기준값에 의해 종속되는 것을 의미한다.
- 완전 함수적 종속 : 어떤 테이블에서 속성 A가 다른 속성 집합 B 전체에 대해 함수적 종속이지만 속성 B의 어떠한 진부분 집합 C에는 함수적 종속이 아닐 때 속성 A는 속성 집합 B에 완전 함수적 종속이라고 한다.
- 부분 함수적 종속 : C에도 함수적 종속일 때를 의미한다.
- 이행적 종속 : A -> B 이고 B -> C 일 때 A -> C 를 만족하는 관계이다.
반정규화
- 반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.
- 자주 사용되는 테이블에 엑세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우, 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려운 경우에 진행한다.
데이터베이스 풀
- 클라이언트의 요청에 따라 각 어플리케이션의 스레드에서 데이터베이스에 접근하기 위해서는 Connection이 필요하다.
- Connection pool은 이런 커넥션을 여러 개 생성해 두어 저장해 놓은 공간(캐시), 또는 이 공간의 커넥션을 필요할 때 꺼내 쓰고 반환하는 기법을 말한다.
- 웹 컨테이너가 실행되면서 DB와 연결된 Connection 객체들을 미리 생성하여 pool에 저장한다. DB 요청 시, pool에서 Connection 객체를 가져와 DB에 접근한다. 처리가 끝나면 pool에 반환한다.
트랜잭션
- 트랜잭션은 작업의 완전성을 보장해주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.
- 트랜잭션의 특징
- 원자성(Atomicity) : 만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다.
- 일관성(Consistency) : 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.
- 고립성(Isolation) : 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다.
- 지속성(Durability) : 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.
Statement, PreparedStatement
- 둘 다 java에서 SQL을 실행할 수 있는 객체이다.
- 속도 면에서 PreparedStatement가 빠르다고 알려져 있다. 이유는 쿼리를 수행하기 전에 이미 쿼리가 컴파일 되어 있으며, 반복 수행의 경우 프리 컴파일된 쿼리를 통해 수행이 이루어지기 때문이다.
- Statement에는 보통 변수를 설정하고 바인딩하는 static sql이 사용되고 Prepared Statement에서는 쿼리 자체에 조건이 들어가는 dynamic sql이 사용된다.
- PreparedStatement가 파싱 타임을 줄여주는 것은 분명하지만 dynamic sql을 사용하는데 따르는 퍼포먼스 저하를 고려하지 않을 수 없다. 하지만 성능을 고려할 때 시간 부분에서 가장 큰 비중을 차지하는 것은 테이블에서 레코드를 가져오는 과정이고 SQL 문을 파싱하는 시간은 이 시간의 10분의 1 에 불과하다. 그렇기 때문에 SQL Injection 등의 문제를 보완해주는 PreparedStatement를 사용하는 것이 옳다.
SQL
- SQL (관계형 DB) 을 사용하면 RDMS에서 데이터를 저장, 수정, 삭제 및 검색할 수 있다.
- 관계형 데이터베이스는 정해진 데이터 스키마에 따라 테이블에 저장된다는 것과 데이터는 관계를 통해 여러 테이블에 분산되어야 한다.
- 스키마를 수정하지 않는 이상은 정해진 구조에 맞는 레코드만 추가가 가능한 것이 관계형 데이터베이스의 특징 중 하나이다.
- 장점 : 명확하게 정의된 스키마, 데이터 무결성 보장, 관계는 각 데이터를 중복없이 한번만 저장한다는 것이다.
- 단점 : 덜 유연하고 데이터 스키마를 사전에 계획하고 알려야 한다. 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있고 대체로 수직적 확장만 가능하다.
- 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우, 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우 사용한다.
NoSQL
- NoSQL은 말그대로 관계형 DB의 반대다. 스키마도 없고, 관계도 없다.
- NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다. 관계형 데이터베이스처럼 여러 테이블에 나누어담지 않고, 관련 데이터를 동일한 컬렉션에 넣는다. 따라서 여러 테이블에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다.
- 장점 : 스키마가 없어서 유연하다. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가가 가능하고 데이터는 애플리케이션이 필요로 하는 형식으로 저장된다. 따라서 데이터 읽어오는 속도가 빨라진다. 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리가 가능하다.
- 단점 : 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있고 데이터 중복을 계속 업데이트 해야 한다. 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 한다.
- 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우, 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우, 데이터베이스를 수평으로 확장해야 하는 경우에 사용한다.
JOIN
- 두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법이다.
- 조인의 종류는 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, CROSS JOIN, SELF JOIN 이 있다.
JDBC
- JDBC(Java Database Connectivity)는 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
- JDBC는 관계형 데이터베이스에 사용되는 SQL문을 실행하기 위해 자바로 작성된 클래스와 인터페이스로 구성되어 있다.
커서
- 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리공간 (DML로 테이블 작업을 할 때 데이터베이스 서버에 의해서 할당된 임시 저장소)
- 커서의 종류
- 명시적 커서 : 사용자가 선언해서 생성 후 사용하는 커서, 데이터를 행별로 테이블에서 읽어 들이는 역할을 해서 주로 여러개의 행을 처리하고자 할 경우 사용
- 묵시적 커서 : SQL에서 기본값으로 제공되는 커서, 데이터베이스 서버에 의해서 자동으로 할당
힌트
- 데이터베이스의 실행계획을 주도하는 옵티마이저에게 원하는 실행계획을 유도하도록 사용된다.
- 힌트, 인덱스, 조인의 개념을 정확히 알고 사용하지 않은 무분별한 힌트의 사용은 성능의 저하를 초래하기 때문에 잘 알고 최적의 실행 경로를 알고 있을 경우 적절하게 사용해야 한다.
인덱스헌팅
- 인덱스 헌팅은 쿼리 성능과 데이터베이스 속도를 향상시키는 데 도움이 되는 인덱스 수집을 강화하는 프로세스이다.
개체
- 개체 : 사람, 사물, 장소, 개념, 사건과 같이 유무형의 정보를 가지고 있는 독립적인 실체
- 개체 타입 : 비슷한 속성의 개체들을 구성함(개체들의 집합 X)
- 강한 개체 타입 : 다른 개체의 도움 없이 독자적으로 존재할 수 있는 개체
- 약한 개체 타입 : 독자적으로는 존재할 수 없고 반드시 상위 개체 타입을 가진다
속성, 관계
- 속성 : 개체가 가진 성질
- 관계 : 개체 사이의 연관성을 나타내는 개념
데이터베이스 회복기법
- 트랙잭션들을 수행하는 도중 장애로 인해 손상 된 데이터베이스를 손상되기 이전의 정상적인 상태로 복구시키는 작업
- 장애의 유형
- 트랙잭션 장애 : 트랜잭션의 실행 시 논리적인 오류로 발생할 수 있는 에러 상황
- 시스템 장애 : H/W 시스템 자체에서 발생할 수 있는 에러 상황
- 미디어 장애 : 디스크 자체의 손상으로 발생할 수 있는 에러 상황
- Undo, Redo
- Undo
- 트랜잭션 로그를 이용하여 오류와 관련된 모든 변경을 취소하여 복구 수행
- 로그파일에 트랜잭션의 시작(START)는 있고 종료(COMMIT)은 없는 경우 수행
- Redo
- 트랜잭션 로그를 이용하여 오류가 발생한 트랜잭션을 재실행하여 복구 수행
- 로그파일에 트랜잭션의 시작(START)와 종료(COMMIT)이 있는 경우
- 로그 파일
- 트랜잭션이 반영한 모든 데이터의 변경사항을 데이터베이스에 기록하기 전에 미리 기록해두는 별도의 데이터베이스
- 안전한 하드디스크에 저장되며 전원과 관계없이 기록이 존재
- 회복 기법
- 로그 기반 회복 기법
- 자연갱신 회복 기법 : 트랜잭션의 부분 완료 상태에선 변경 내용을 로그 파일에만 저장, 커밋이 발생하기 전까진 데이터베이스에 기록하지 않음, UNDO 필요없음
- 즉시갱신 회복 기법 : 트랜잭션 수행 도중에도 변경 내용을 즉시 데이터베이스에 기록, UNDO 필요
- 검사점 회복 기법(체크포인트 회복 기법)
- 장애 발생 시 체크포인트 이전에 처리된 트랜잭션은 회복에서 제외하고 체크포인트 이루에 처리된 트랜잭션은 회복 작업을 수행
- 그림자 페이징 회복 기법
- 트랜잭션이 실행되는 메모리상의 Current Page Table과 하드디스크의 Shadow Page Table을 이용
- 미디어 회복 기법
- 디스크와 같은 비휘발성 저장 장치가 손상되는 장애 발생을 대비한 회복 기법, 데이터베이스 내용을 백업, 미러링, RAID등을 통해 별도의 물리적 저장장치에 덤프
- ARIES 회복 기법
- REDO 중 Repeating history: 붕괴 발생 이전에 수행했던 모든 연산을 다시 한번 수행. 붕괴가 발생했을 때 완료되지 않은 상태였던 (진행 트랜잭션)은 UNDO
- UNDO 중 Logging: UNDO를 할 때에도 로깅을 함으로써 회복을 수행하는 도중에 실패하여 회복을 다시 시작할 때에 이미 완료된 UNDO 연산은 반복하지 않음
체크포인트
- 데이터베이스 엔진이 예기치 않은 종료 또는 충돌 후 복구과정에서 로그에 포함된 변경 내용의 적용을 시작할 수 있는 알려진 올바른 지점을 만드는 것
데이터베이스 잠금
- 데이터가 현재 시점에 다른 트랜잭션에서 사용되고 있는지 여부에 대한 트랙잭션을 의미한다.
데이터웨어 하우징
- 분석을 수행하기 위해 중앙 위치에서 트랜잭션 및 기타 소스에서 파생되는 데이터에 대한 액세스 및 저장을 데이터웨어 하우징이라고 한다.
파티셔닝
- 더 세밀한 수준에서 데이터를 관리하고 액세스하기 위해 테이블, 인덱스를 더 작은 조각으로 분할하는 프로세스
- 많은 양의 데이터 저장 비용을 줄이고 성능과 관리 효율성을 향상
- 중요성
- 쿼리 성능 및 관리 용이성을 향상
- 일반적인 관리 작업을 단순화
- 가용성이 매우 높은 시스템을 구축하기 위한 핵심 도구로 작동
- 단일 파티션의 많은 부분에 액세스 가능
데이터사전
- 데이블과 데이터베이스 개체의 내용과 구조를 설명하는 정보 집합
- 데이터사전에 저장된 정보의 역할은 데이터베이스 요소 간의 관계를 제어, 조작 및 액세스하는 것이다