PostgreSQL 12 출시
2019년 10월 3일 PGDG(PostgreSQL Global Development Group, 이하 PGDG)에서 PostgresSQL 12(이하 PG 12로 표기) 버전의 출시를 발표했습니다.
PG 12 버전에서 기능이 강화된 것으로 특히 대규모 데이터 세트를 다루는 쿼리의 성능 향상과 전반적인 공간 사용률의 대폭적인 개선을 들 수 있습니다. 이번 12 버전 출시에서는 애플리케이션 개발자에게 SQL/JSON 패스(Path) 표현식을 지원하고 공통 테이블식(common table expression, WITH) 쿼리의 실행방법을 최적화했으며 생성열(generated column)이라는 새로운 기능도 제공합니다. PG 커뮤니티는 앞으로도 국제화, 인증, 용이하게 관리하는 방법 등의 기능을 제공함으로써 PG의 확장성과 효율성을 지원해나갈 것입니다. 이번 12 버전에서는 개발자가 자신만의 방식으로 데이터를 저장할 수 있는 pluggable table storage 인터페이스도 도입되었습니다.
PG를 뒷받침하고 있는 개발 커뮤니티는 이번 PG 12 버전에서 사용자가 최소한의 노력으로 성능과 공간관리를 향상시킬 수 있는 기능 뿐만 아니라 기업 인증(administration functionality), 관리기능, SQL/JSON 지원에 기여해왔습니다. PGDG 개발그룹 코어팀의 일원인 Dave Page는 “이번 12 버전은 운영 환경에서 유연하고 안정적이라는 PG의 명성을 그대로 쌓아가면서도 크고 작은 PG 데이터베이스의 부하 관리가 쉬워야 한다는 기조에도 부합하도록 만들었다”고 말했습니다.
PG는 20년 이상 오픈소스 방식으로 개발되어온 덕분에 다양한 규모의 조직에서 선호하는 관계형 데이터베이스의 지위를 이어오고 있습니다. 이 프로젝트는 2018년에 이어 2년 연속으로 DB-Engines에서 「DBMS of the Year」로 선정되었고 OSCON 2019에서는 「Lifetime Achievement」라는 오픈소스상을 수상하는 등 업계에게 인지도를 넓혀가고 있습니다.
전반적인 성능 개선
PG 12에서는 인덱스 시스템과 파티션 성능이 대폭 강화되었습니다. PG에서 표준타입 인덱스인 B-tree 인덱스는 부하를 좀더 잘 다룰 수 있도록 최적화되어서 인덱스가 빈번하게 변경하는 워크로드에 대해서 적절하게 처리합니다. 이번 버전에서는 TPC-C 벤치마크를 사용하여 공간 사용률을 평균 40% 감소시킬 수 있었으며 쿼리 성능도 향상되었음을 확인할 수 있습니다.
파티션 테이블에서 실행되는 쿼리는 특히 수천개의 파티션으로 이뤄진 테이블에서 한정된 서브셋만 반환하는 경우에는 분명한 성능 향상을 보였습니다. 이번 버전에서는 INSERT와 COPY 구문으로 파티션 테이블에 데이터를 추가하는 것의 성능이 개선되었으며 쿼리 실행을 블록하지 않고 새로운 파티션을 테이블에 붙이는 기능도 추가되었습니다.
GiST, GIN 및 SP-GiST의 인덱스 타입에서 wal 로그가 생성되면서 발생하는 부하를 줄였고 GiST 인덱스에서 커버링 인덱스(INCLUDE 구문)를 작성하는 기능이 추가되었으며 SP-GiST 인덱스를 사용하여 거리연산자(<->)를 이용한 K 최근접 이웃 기법(K-nearest neighbor) 쿼리를 실행하는 기능 및 CREATE STATISTICS 구문으로 균일하지 않게 분포하는 열(column)을 이용하여 더 나은 실행계획을 생성하는 MCV(Most Common Value) 통계를 지원하는 등 전체적인 성능을 개선하는 기능들이 추가되었습니다.
PG 11버전에서 도입된 LLVM를 사용한 Just In Time(JIT) 컴파일이 디폴트가 되었습니다. JIT 컴파일은 WHERE구, 타겟리스트, 집계 및 일부 내부적인 동작을 하는 데 성능 향상을 기대할 수 있습니다. JIT 컴파일은 PostgreSQL이 LLVM으로 컴파일되었거나 패키지로 만들어진 경우에 이용할 수 있습니다.
SQL 표준 준수 및 기능강화
PostgreSQL은 SQL표준을 준수하는 것으로 유명한데(POSTGRES에서 PostgreSQL로 이름을 변경한 이유 중 하나), 12 버전에서는 SQL 표준에서 확장된 기능을 추가했고 표준을 따르는 기조를 이어가고 있습니다. SQL/JSON 표준에서 정의된 JSON 패스(Path)식을 이용하여 JSON 도큐먼트 쿼리를 실행하는 기능도 추가되었습니다. 이러한 쿼리는 JSONB 포맷으로 저장된 도큐먼트를 기존의 인덱스 작성 매커니즘을 이용하여 데이터를 효율적으로 가져올 수 있습니다.
WITH 쿼리문이라고도 부르는 공통 테이블식(common table expression)은 PG 12버전에서 자동적으로 인라인(inline)화되었습니다. 이를 통해서 기존의 많은 쿼리들의 성능을 향상시킬 수 있습니다. 이번 버전에서는 재귀적이지 않고 부작용이 없이 쿼리의 마지막 부분에서 한 번만 참조되는 경우에만 인라인화됩니다.
생성열(generated columns)이라는 기능도 도입되었습니다. SQL표준에서 정의된 이 형식의 열은 같은 테이블의 다른 열에서 값을 가져와서 계산합니다. 이번 버전에서는 계산된 값이 디스크에 저장돼 있는 “Stored generated columns”를 지원합니다.
국제화
12 버전에서는 사용자가 비결정조합(nondeterministic collations)을 정의할 수 있도록 하여 ICU 조합의 지원 범위를 넓혔습니다. 예를 들면 대문자와 소문자를 구분하지 않는 비교나 악센트를 구분하지 않는 비교가 가능합니다.
인증
PG 12에서는 추가적인 보안과 기능을 통한 다양한 개선이 이뤄져서 빈틈없는 인증 기능이 더욱 확대되었습니다. GSSAPI 인터페이스를 통한 인증으로 클라이언트와 서버 양쪽의 암호화가 가능할 뿐만 아니라 OpenLDAP로 컴파일 되었다면 PG가 LDAP 서버를 검출할 수 있게 되었습니다. 다증 인증(Multi-Factor Authentication)도 지원합니다. PG 서버에서 clientcert=verify-full 옵션을 사용하면 인증하려는 클라이언트에게 유저명과 함께 유효한 SSL증명서의 제출을 요구하고 이를 별도의 인증 방법(예를 들면 scram-sha-256) 요건과 조합할 수도 있습니다.
관리
이번 버전에서는 REINDEX CONCURRENTLY 명령어를 사용하면 인덱스의 쓰기 작업을 블로킹하지 않고 리빌드할 수 있는 기능이 도입되었습니다. 장시간에 걸친 인덱스 리빌딩을 위해서 다운타임을 확보하는 시나리오가 필요하지 않습니다. pg_checksums 명령어를 사용하면 데이터베이스 클러스터가 오프라인일 때 페이지 체크섬(page checksums)을 유효 또는 무효로 변경할 수 있습니다. 이전 버전에서는 디스크에 보존된 데이터의 정합성을 검증하는 기능인 페이지 체크섬은 initdb 명령어로 PG 클라스터를 초기화를 할 때에만 유효로 할 수 있었습니다.
이번 버전에 포함된 전체 기능의 목록은 이 링크에 연결된 릴리즈 노트를 참고해주세요.