아키텍처
클라이언트/서버 모델을 사용하는 PostgreSQL의 세션은 아래와 같은 프로세스를 갖는다.
- 서버 프로세스: 데이터베이스 파일을 관리하는 주체. 클라이언트로부터의 연결을 수락하여 클라이언트 대신 데이터베이스의 액션을 수행한다. 서버 프로세스(프로그램)을 postgres라고 부른다.
- 클라이언트: 데이터베이스 작업이 필요한 클라이언트(프론트엔드) 애플리케이션. 텍스트 기반의 툴, 웹 서버 등 다양한 형태의 클라이언트를 총칭한다. 대부분은 사용자가 직접 개발한다.
일반적인 클라이언트/서버 애플리케이션에서처럼 클라이언트와 서버는 서로 다른 호스트일 수 있다. 이럴 땐 TCP/IP 네트워크 연결을 통해 통신한다. 서로 다른 시스템에서 접근 가능한 파일이 다를 수 있음을 염두하자.
PostgreSQL 서버는 클라이언트의 여러 연결을 동시에 처리할 수 있다. 이를 위해 각 연결마다 새로운 프로세스를 시작("fork")한다. 이 시점부터 클라이언트와 새로운 서버 프로세스는 다른 프로세스의 개입없이 통신한다. 즉, 관리자 서버 프로세스는 항상 실행 중이며 클라이언트의 연결을 기다리고 있다.
컨셉
PostgreSQL은 관계형 데이터베이스 관리 시스템(RDBMS)이다. 이는 관계(relation)적으로 저장된 데이터를 관리하는 것을 의미한다. 관계는 기본적으로 테이블을 의미하는 수학적 용어다. 관계는 특정 유형의 데이터가 저장된 테이블을 가리킨다. 데이터를 테이블에 저장한다는 개념은 오늘날 매우 일반적인 것이지만 데이터베이스를 구성하는 다른 방법도 많이 있다. 대표적인 예로 파일과 디렉토리를 계층적으로 구성한 유닉스 계열 운영체제의 데이터베이스가 있다.
각 테이블은 명명된 행들의 모음이다. 특정 테이블의 각 행은 같은 이름의 열 집합을 갖고, 각 열은 특정 데이터 타입이다. 특정 행에서 각 열은 정해진 순서를 갖는 반면 각 행은 특정 테이블 내에서 순서가 보장되지 않는다. 이는 데이터베이스 엔진이 효율적으로 데이터를 저장하고 관리하기 위해 행의 물리적인 저장 순서를 보장하지 않는다는 의미이다. 다만 행의 순서는 명시적인 방식으로 정렬하고 표시할 수 있다.
행의 물리적인 저장 순서를 보장하지 않는 것이 효율적인 이유는 아래와 같다.
- 데이터 삽입 및 삭제의 효율성: 일반적으로 데이터는 빈번하게 삽입되거나 삭제될 수 있다. 만약 물리적인 저장 순서를 보장해야 한다면, 새로운 데이터를 삽입하거나 삭제할 때마다 데이터를 이동시켜야 하고 이능 성능 저하를 유발할 수 있다.
- 인덱스 구조 사용: 데이터베이스에서는 검색 성능을 향상시키기 위해 인덱스를 사용한다. 인덱스는 특정 열에 대한 검색을 빠르게 만들어 주는 동시에 행의 물리적인 순서와 독립적으로 관리된다. 즉, 행의 순서를 보장하지 않아도 인덱스를 활용하여 빠른 검색을 수행한다.
- 다양한 쿼리 패턴 대응: 물론 물리적인 순서를 보장하는 것이 어떠한 쿼리에는 빠르게 응답할 수 있는 방법이 될 수 있다. 그러나 다른 종류의 쿼리에는 반대로 성능이 저하될 수도 있다.
- 파티션 및 병렬 처리의 향상: 대용량 데이터셋을 처리하기 위한 파티션, 병렬 처리 등에 용이하다.
테이블은 데이터베이스에 포함되고, 여러 데이터베이스는 단일 PostgreSQL 서버 인스턴스에서 효율적으로 관리될 수 있도록 클러스터라는 이름으로 그룹화된다.