본문 바로가기
RDBMS/PostgreSQL

[PostgreSQL] 13.0 Release note 주요 내용 정리

by 연습장이 2024. 2. 22.
728x90
반응형

목적

  최신 버전 업그레이드 전, 영향도 평가하기 위함

개요

  • B트리 인덱스 항목의 중복제거를 통한 성능 개선 및 공간 절약
  • 집계 및 파티션된 테이블 사용에 대한 쿼리의 성능이 개선됨
  • 확장된 통계 사용 시 쿼리 플랜이 개선됨
  • 인덱스의 병렬화된 배큠 동작
  • 증분 정렬 지원

해당 버전으로의 이관 가이드

  • pg_dumpall 또는 pg_upgrade 사용을 통한 dump/restore 방식이 요구됨

이전 버전과의 비호환 내용

  • SIMILAR TO ... ESCAPE NULL이 NULL을 리턴하도록 변경됨. 이전에는 ESCAPE 값이 null이면 기본 이스케이프 문자열(백슬래시 문자)을 사용하는 것으로 간주되었고 이는 subtring(text FROM pattern ESCAPE text)에서도 적용됨. 원래 함수를 변경하지 않고 유지하여 예전 뷰에 대해 이전 동작을 그대로 유지하도록 함
  • json[b]_to_tscvector()가 이것의 문자열 옵션의 스펠링을 완전히 체크하도록 함
  • 기본값이 아닌 effective_io_concurrency 값이 동시성에 영향을 미치는 방식을 변경함. 이전에는 이 값이 동시 요청의 수를 설정하기 전에 조정되었으나 이제 바로 적용됨
  • pg_stat_ssl 및 pg_stat_gssapi 시스템 뷰에서 보조 프로세스가 표시되지 않도록 함. 이 보조 프로세스를 보려면 pg_stat_activity에 left join을 사용해야 볼 수 있음
  • 일관성을 개선하기 위해 다양한 대기 이벤트를 개명함
  • 더 정확한 명령어 태그를 반환하도록 ALTER FOREIGN TABLE ... RENAME COLUMN 명령어를 수정함. 이전에는 ALTER TABLE을 리턴하였으나 이제 ALTER FORIEGN TABLE을 리턴함
  • 더 정확한 커맨드 태그를 반환하도록 ALTER MATERIALIZED VIEW ... RENAME COLUMN 명령어를 수정함. 이전에는 ALTER TABLE을 리턴하였으나 이제 ALTER MATERIALIZED VIEW를 리턴함
  • 설정 파라미터인 wal_keep_segments를 wal_keep_size로 개명함. 이것은 standby 서버에 얼마나 많이 WAL이 보관되는지를 결정함. 이전에는 파일 수로 나타냈으나 이제 MB로 표시됨. 이 값을 이미 사용하였다면 아래 공식으로 보정할 것
    • wal_keep_size = wal_keep_segments * wal_segment_size (보통 16MB)
  • pre-pg 8.0 문법을 사용하여 operator classes를 정의하는 지원이 제거됨
  • pre-pg 7.3 문법을 사용하여 foreign key constraints를 정의하는 지원이 제거됨
  • pre-pg 7.3 서버를 사용하여 pseudo 타입인 opaque에 대한 지원이 제거됨
  • pageinspect의 bt_metap()이 더 정확한 데이터 타입을 반환하여 오버플로우를 더 적게 일으키도록 함

변경 사항

Server 

파티셔닝

  • 더 많은 케이스에 파티션 프루닝이 일어나도록 함
  • 더 많은 케이스에 partitionwise 조인이 일어나도록 함. 예를 들어 파티션 범위가 정확히 일치하지 않아도 발생할 수 있도록 함
  • 파티션된 테이블에 row-level BEFORE 트리거가 지원됨. 그러나 트리거 대상이 파티션이라면 허용하지 않음
  • 파티션된 테이블에 대해 publications를 통해 논리적 복제가 발생하도록 허용됨. 이전에는 파티션이 개별적으로 복제를 했었어야 함. 파티션을 추가/제거하면 publication에도 자동적으로 적용됨. publication 생성 옵션인 publish_via_partition_root를 통해 파티션의 변경 내용을 자체 내용으로 게시할지 아니면 상위(부모) 변경 내용으로 게시할지 제어할 수 있음
  • 구독자에 대해 파티션된 테이블로의 논리적 복제를 허용함. 이전에는 비파티션된 테이블로의 행만 구독자가 받을 수 있었음
  • 파티셔닝 표현법에 전체 행 변수(table.*와 같은)를 허용함

인덱스

  • 비트리 인덱스에 더 효율적으로 중복을 저장함. 이렇게 하면 중복 키를 한 번만 저장하여 카디널러티가 낮은 컬럼을 효율적으로 비트리 인덱싱할 수 있음. pg_upgrade로 업그레이드하는 사용자는 REINDEX를 적용해야 이 기능이 반영됨
  • GiST와 SP-GiST 인덱스가 box 컬럼에 대해 ORDER BY box ↔ point 같은 쿼리를 지원함
  • tsquery 탐색 내 NOT 항목 등에 대해 GIN 인덱스가 더 효율적으로 처리되도록 허용함
  • 인덱스 operator classes가 파라미터를 받을 수 있도록 함
  • CREATE INDEX가 GiST signature 길이와 integer 범위의 최대 수를 명시할 수 있도록 허용함
  • 기본값이 아닌 데이터 정렬을 사용하는 인덱스가 테이블의 고유 또는 기본키 제약 조건으로 추가되지 않도록 수정함. 인덱스의 데이터 정렬은 해당 정렬과 일치해야 하지만, 이전에는 ALTER TABLE이 이를 확인하지 못했음

옵티마이저

  • 포함/매치 연산에 대해 옵티마이저의 선택도 추정이 개선됨
  • 확장된 통계에 대해 통계 타겟 설정을 허용함. ALTER STATISTICS ... SET STATISTICS 명령어로 제어가 가능하며 이전에는 일반적인 통계 타겟 설정에 근거해서 계산했었음
  • 단일 쿼리에 대해 다중 확장된 통계 오브젝트의 사용을 허용함
  • OR 항목이나 IN/ANY 상수 목록에 대해 확장된 통계 오브젝트의 사용을 허용함
  • FROM 절의 함수가 상수로 평가되는 경우 끌어올림(인라인)을 허용함

일반적인 성능

  • 증분 정렬이 구현됨. 중간 쿼리 결과가 요구되는 정렬 순서의 하나 이상의 선행 키에 의해 정렬되었을 경우, 행이 동일한 선행 키를 가진 배치 처리로 정렬된다면 나머지 키만 고려하여 추가 정렬을 수행할 수 있음. 이 기능은 enable_incremental_sort 파라미터로 제어 가능
  • inet 값의 정렬 성능이 개선됨
  • 거대한 집계 결과 셋에 대해 해시 집계가 디스크 공간을 사용하도록 허용함. 이전에는  work_mem 메모리보다 더 많이 사용 될 것으로 예상되었다면 이를 회피했음.
  • 오토배큠에서 배큠 작업을 트리거하는데 update와 delete 뿐만 아니라 삽입에서도 가능하도록 허용함. 이전에는 제거할 데드 튜플이 없으므로 삽입 전용 작업은 자동 분석(analyze)만 트리거했었음. 하지만 배큔 스캔에는 페이지 전체 표시 비트 설정과 같은 다른 유용한 부수적인 효과가 있어 index only scan의 효율성이 향상됨. 또한 삽입 전용 테이블이 주기적으로 배큠 스캔을 받도록 하면 오래된 튜플을 '고정(freezing)'하는 작업이 분산되어 전체 테이블이 한꺼번에 wraparound 방지 임계값에 도달했을 때 갑자기 많은 양의 freezing 작업을 수행해야 하는 일이 발생하지 않음. 이 기능은 신규 파라미터인 autovacuum_vacuum_insert_threshold 및 autovacuum_vacuum_insert_scale_factor 또는 대응되는 테이블 저장 옵션에서 조정 가능함
  • maintenance operations에 대한 I/O 동시성을 제어하기 위해 maintenance_io_concurrency 파라미터가 추가됨
  • wal_level이 minimal로 설정된다면 WAL 쓰기는 relation에 생성 혹은 재쓰기의 트랜잭션 동안 스킵될 수 있도록 함. wal_skip_threshold보다 큰 테이블은 WAL을 생성하는 대신 파일이 fsync됨. 이전에는 이 작업이 copy 작업에만 수행되었음
  • 많은 테이블스페이스가 사용중일 때 DROP DATABASE 명령어를 replay할 때의 성능이 개선됨
  • 매우 많은 테이블의 truncation 성능이 개선됨
  • TOAST 처리된 값의 선행 바이트 검색이 개선됨. 이전에는 일부 선행 바이트만 필요할 때에도 out-of-line 토스트 값을 모두 가져왔음. 이제 결과를 생성하기에 충분한 데이터만 가져옴
  • LISTEN/NOTIFY의 성능이 개선됨
  • integers에서 text로의 형변환 속도가 빨라짐
  • 많은 SQL문을 포함하는 확장 스크립트와 쿼리 문자열의 메모리 사용이 감소함

모니터링

  • WAL 사용 통계를 추적하는데 EXPLAIN, auto_explain, autovacuum, pg_stat_statements가 허용됨
  • 로깅하는데 모든 구문보다 SQL 문의 샘플을 허용함. log_min_duration_sample 기간보다 오래 걸리는 구문 중에 log_statements_sample_rate 비율의 일부가 기록됨
  • csvlog에 백엔드 타입을 추가하고 선택적으로 log_line_prefix 로그 출력을 추가함
  • prepared statement 파라미터 로깅의 제어를 개선함

시스템 뷰

  • 병렬 워커의 리더 프로세스를 기록하기 위해 lead_pid를 pg_stat_activity에 추가함
  • 베이스 백업의 스트리밍 처리를 기록하기 위해 pg_stat_progress_basebackup 시스템 뷰가 추가됨
  • ANALYZE 진행을 기록하기 위해 pg_stat_progress_analyze 시스템 뷰가 추가됨
  • shared memory 사용을 표시하기 위해 pg_shmem_allocations 시스템 뷰가 추가됨
  • 내부의 SLRU 캐시를 모니터링하기 위해 pg_stat_slru 시스템 뷰가 추가됨
  • track_activity_query_size를 1MB로 설정함. 이전에는 100kB였음

대기 이벤트

  • posix_fallocate()로 DSM 세그먼트를 생성하는 동안 대기 이벤트를 기록함
  • 비용 기반 배큠 지연에 대해 기록하기 위해 VacuumDelay 대기이벤트를 추가함
  • WAL 아카이브와 회복 일시중지에 대한 대기이벤트를 추가함. 이 이벤트는 BackupWaitWalArchive와 RecoveryPause임
  • 복구 충돌을 모니터링 하기 위해 RecoveryConflictSnapshot과 RecoveryConflictTablespace 대기이벤트를 추가함
  • BSD기반 시스템에 대한 대기 이벤트의 성능을 개선함

인증(Authentication)

  • 슈퍼유저만이 ssl_passphrase_command 설정을 볼 수 있도록 함.
  • 암호화된 연결에 대해 서버의 기본 최소 TSL 버전을 1.0에서 1.2로 변경함.이 설정은 ssl_min_protocol_version으로 제어 가능함

서버 설정

  • 읽기 전용 트랜잭션 모드에서 허용되는 유틸리티 명령에 대한 규칙이 강화됨. 이를 통해 병렬 쿼리에서 실행할 수 있는 유틸리티 명령의 수가 증가됨
  • 서버 시작 후에 allow_system_table_mods가 변경되도록 함
  • allow_system_table_mods가 설정된 경우 슈퍼유저가 아닌 사용자가 시스템 테이블을 수정할 수 없도록 함. 이전에는 서버 시작시 allow_system_table_mods가 설정되어 있으면 슈퍼유저가 아닌 사용자도 시스템에 insert/update/delete 명령을 실행할 수 있었음

Streaming Replication And Recovery

  • reload에 의해 스트리밍 복제 설정이 변경되도록 허용함. 이전에는 primary_conninfo와 primary_slot_name을 변경시 재시작이 요구됨
  • 영구적으로 사용하는게 아무것도 없다면 임시 복제 슬롯을 WAL 리시버가 사용할 수 있도록 함. 이 설정은 wal_receiver_create_temp_slot 파라미터로 제어할 수 있음
  • 복제 슬롯에 대한 WAL 저장 공간을 max_slot_wal_keep_size로 제어할 수 있도록 함
  • standby 승격이 어떤 요청된 일시 중지에 취소할 수 있도록 허용함. 이전에는 일시 중지된 상태에서는 승격이 불가했음
  • 명시된 복구 타겟에 복구가 도달할 수 없을 경우 에러를 반환하도록 함
  • 메모리에 꽉차 디스크에도 쓰여지기 전에 논리적 디코딩에 의해 얼마나 메모리가 사용될지 제어할 수 있게 됨. 이는 logical_decoding_work_mem 파라미터로 제어할 수 있음
  • WAL에 의해 타당하지 않은 페이지(block 개념)가 참조되었음에도 복구가 계속될 수 있도록 허용함. 이는 ignore_invalid_pages 파라미터로 제어가 가능함

Utility Commands

  • vacuum 명령어가 테이블의 인덱스를 병렬로 처리할 수 있도록 함
  • 마지막 결과행과 일치하는 추가 행을 반환하도록 FETCH FIRST가 WITH TIES를 사용할 수 있도록 함
  • EXPLAIN의 BUFFER 출력물 내 plangging-time 버퍼 사용을 보고함
  • 생성된 테이블에 CHECK 제약 조건의 NO INHERIT 속성을 전파호도록 CREATE TABLE LIKE 구문에 추가함
  • 파티션된 테이블에 LOCK TABLE 사용 시 자식 테이블에 대해 권한을 체크하지 않도록 함
  • indentiy 컬럼으로 삽입 시 OVERRIDING USER VALUE를 허용함
  • 컬럼으로부터 GENERATED 속성 제거를 허용하도록 ALTER TABLE ... DROP EXPRESSION을 추가함
  • 다단계 ALTER TABLE 명령어 내 버그가 수정됨. 열이 이미 존재하느 경우 파생된 작업(인덱스 생성과 같은)이 실행되지 않는 IF NOT EXISTS 절이 이제 정상적으로 동작함
  • 뷰 컬럼을 개명하는데 ALTER VIEW 문법이 추가됨. 뷰 컬럼을 개명하는건 이미 가능하지만 ALTER TABLE RENAME COLUMN과 혼동될 수 있기 때문
  • 기본 타입의 TOAST 속성 및 지원 기능을 수정하는 ALTER TYPE 옵션이 추가됨
  • CREATE DATABASE LOCALE 옵션이 추가됨. 이는 LC_COLLATE와 LC_CTYPE을 하나의 옵션으로 결합할 수 있음
  • DROP DATABASE가 대상 DB를 사용하여 세션 연결을 끊고 삭제가 성공하도록 허용함. 이 옵션은 FORCE 옵션을 사용하면 됨

Data Types

  • 호환 가능한 인수가 필요한 함수에서 사용할 수 있는 다형성 데이터 유형이 추가됨. 새로운 데이터 유형은 anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange임
  • FullTransactionId를 표시하기 위해 SQL 데이터 타입인 xid8이 추가됨
  • collation 오브젝트의 OIDs를 표시하기 위해 신규 데이터 타입인 regcollation과 관련된 함수가 추가됨

Functions

  • NULL 처리가 개선된 jsonb_set()의 대체 버전이 추가됨. jsonb_set_lax()로 요청에 따라 지정된 키를 JSON null로 설정하거나 키를 삭제하거나, 예외를 발생시키거나 수정되지 않은 jsonb 값을 반환하는 방식으로 NULL의 새 값을 처리함
  • jsonpath.datetime() 메소드가 추가됨
  • pg_lsn에 대해 min()과 max()이 추가됨. 이 것은 특히 모니터링 쿼리에 유용함
  • 유니코드 탈출구(예를 들어 E'\unnnn' or U&'\nnnn')가 DB 인코딩이 UTF-8이 아님에도 DB 인코딩 내 어떤 문자든 명시할 수 있도록 허용됨
  • version-4 UUIDs를 발생시키기 위한 gen_random_uuid()함수가 추가됨
  • gcd(최대공약수)와 lcm(최소공배수) 함수가 추가됨
  • numeric 타입의 qsrt과 ln 함수의 정확도와 성능이 개선됨

PL/PgSQL

  • 간단한 PL/pgSQL 표현의 성능이 개선됨
  • 이뮤터블 표현을 사용하는 PL/pgSQL 함수의 성능이 개선됨

Client Interfaces

  • 암호화된 연결에 대해 채널 바인딩을 libpq 클라이언트가 요구할 수 있도록 함. 이는 channel_biding 파라미터로 강제할 수 있으며 man-in-thje-middle 보안 공격을 예방함
  • 암호화된 연결에 대해 최소와 최대 TLS 버전을 지정할 수 있는 libpq 커넥션 파라미터가 추가됨. ssl_min_protocol_version, ssl_max_protocol_version으로 가능하며 기본적으로 최소 TLS 버전은 1.2임

Client Applications

psql

  • psql의 기본 프롬트트에 트랜잭션 상태(%x)룰 추가함
  • \dt+ 를 통해 테이블의 지속성을 표시할 수 있음
  • psql의 \d에서 TOAST 테이블에 대한 출력을 개선함

pgbench

  • \gset와 같이 동작하지만 다주 쿼리에 대해 해당하는 \aset 명령어가 추가됨
  • pgbench가 --show-script 옵션을 사용하여 스크립트 내용물을 볼 수 있도록 함

Server Application

  • 기본 백업에 대해 백업 manifests를 발생시키고 이를 확인함. 해당 툴인 pg_verfifybackup은 백업을 확인함
  • pg_basebackup이 기본적으로 전체 백업 사이즈를 평가함. 이 것은 pg_stat_progress_basebackup을 통해 과정을 볼 수 있음. 
  • 스탠바이를 설정하기 위해 pg_rewind 옵션이 추가됨. 이 것은 pg_basebackup의 --write-recovery-conf 옵션에 대응됨
  • foreign 서버로부터 데이터를 덤프할 수 있도록 pg_dump에 --include-foreign-data 옵션이 추가됨
  • vacuumdb에 의해 병렬 모드로 동작하도록 vacuum 명령어가 추가됨. 이는 --parallel 옵션으로 제어 가능함
  • createuser로부터 --adduser와 --no-adduser가 제거됨
  • pg_upgrade가 동작하는 동안 기본 --new-bindir 설정으로 pg_upgrade 프로그램의 디렉토리를 사용함

Documentation

  • -

Source Code

  • 파이썬 2.5.x과 그 이전 버전에 대한 지원을 제거함
  • OpenSSL 0.9.8 및 1.0.0에 대한 지원을 제거함

Additional Modules

  • extensions를 신뢰할 수 있도록 지정되는 것을 허용함. 이러한 extensions는 슈퍼유저가 아니더라도 DB 수준의  CREATE 권한이 있는 사용자가 DB에 설치가 가능함. 이 변경은 또한 pg_pltemplate 시스템 카탈로그도 제거할 수 있음
  • 슈퍼유저가 아닌  유저가 postgres_fdw 외부 서버에 비밀번호 없이 연결이 가능하도록함
  • postgres_fdw가 인증서 인증을 사용할 수 있도록 함
  • pg_stat_statements가 SELECT .. FOR UPDATE 명령을 FOR UPDATE가 없는 명령과 구분하여 처리하도록 함
  • pg_stat_statements가 선택적으로 구문의 계획 시간을 추적할 수 있도록 함. 기존에는 실행시간만 추적했음

참고

728x90
반응형