본문 바로가기
RDBMS/PostgreSQL

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

by 연습장이 2024. 3. 14.
728x90
반응형

목적

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

 

개요

  • 저장 프로시저가 이제 OUT 파라미터를 통해 데이터를 반환할 수 있음
  • 공통 테이블 표현식(CTE)을 위한 SQL 표준 SEARCH와 CYCLE 옵션이 구현됨
  • 이제 배열 뿐만 아니라 유용한 표기법으로 사용되는 모든 데이터 유형에 대해 첨자(subscripting)를 적용할 수 있음. 이번 릴리즈에서는 jsonb 및 hstore 유형이 첨자 연산자를 획득함
  • Range 타입이 multiranges를 추가함으로써 확장되어, 연속되지 않은 데이터 범위를 표현할 수 있게 됨
  • 병렬 쿼리, 높은 동시 작업 부하, 파티션된 테이블, 논리 복제 및 배큠 작업에 대해 다수의 성능 개선이 이루어짐
  • 비트리 인덱스 업데이트가 더 효율적으로 관리되어, 인덱스 팽창(bloat)가 감소됨
  • 배큠이 DB가 트랜잭션 ID wraparound 조건에 접근하기 시작하면더 공격적으로 되고, 필수적이지 않은 청소는 생략함
  • 확장 통계가 이제 표현식에 대해서도 수집되어, 복잡한 쿼리에 대한 더 나은 계획 결과를 제공함
  • libpq는 이제 여러 쿼리를 파이프라인 처리할 수 있는 능력을 가지고 있으며, 이는 고지연 연결에서 처리량을 증가시킬 수 있음

 

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

  • pg_dumpall 또는 pg_upgrade 사용을 통한 dump/restore 방식이 요구됨
  • 물리적 복제를 이용한 업그레이드 시 마스터노드 전에 세컨더리부터 진행할 것

 

이전 버전과의 비호환 내용

  • 아래 해당되는 FBI는 재생성이 요구됨
    • array_append()
    • array_prepend()
    • array_cat()
    • array_position()
    • array_positions()
    • array_remove()
    • array_replace()
    • width_bucket()
  • 내장된 기하학 데이터 타입 및 contrib 모듈인 cube, hstore, intarray, seg에 대한 @ 및 ~ 포함 연산자가 제거됨. 대신 <@ 및 @>를 권장함
  • to_tsquery 및 websearch_to_tsquery()를 수정하여 폐기된 토큰을 포함한 쿼리 텍스트를 올바르게 구문 분석하도록 함. 즉 반환값이 바뀌었다는 의미.
    • websearch_to_tsquery('"pg_class pg"') 및 to_tsquery('pg_class <-> pg')는 이전에 ( 'pg' & 'class' ) <-> 'pg'를 출력했지만, 이제는 'pg' <-> 'class' <-> 'pg'를 출력함
  • webserach_to_tsquery()를 수정하여 따옴표 안의 여러 인접한 폐기된 토큰을 올바르게 구문 분석함. 즉, 반환값이 바뀜
    • websearch_to_tsquery('"aaa: bbb"')는 'aaa' <2> 'bbb'를 출력했지만, 이제는 'aaa' <-> 'bbb'를 출력함
  • EXTRAC T()를 변경하여 numeric 타입 대신 float8을 반환함
  • 숫자 매개변수를 가진 var_samp() 및 stddev_samp()가 단일 NaN에 대해 NaN이 아닌 NULL을 반환하도록 함
  • 존재하지 않거나 삭제된 열에 대한 has_column_privilege() 검사에서 속성 번호를 사용할 때 false를 반환하도록 함
  • 무한 윈도우 함수 범위의 처리를 수정함
  • 팩토리얼 연산자인 ! 및 !! 및 함수 numeric_fac()를 제거함. factorial() 함수는 여전히 지원됨
  • 음수에 대한 factorial()를 금지함
  • 후위(right-unary) 연산자 지원을 제거함
  • 정규 표현식 개행-민감(newline-sensitive) 모드에서 \D와 \W 단축키가 줄바꿈과 일치하도록 변경함
  • 정규 표현식 역참조 시 제약 조건을 무시하도록 함
  • 정규 표현식 문자 클래스에서 \w를 범위 시작 또는 끝으로 사용하지 못하도록 변경함
  • 사용자 정의 서버 매개변수 이름이 따옴표 없는 SQL 식별자에서 유효한 문자만 사용하도록 요구함
  • 파라미터 vaccum_cleanup_index_scale_factor를 제거함
  • 파라미터 operator_precedence_warning을 제거함
  • pg_hba.conf에서 clientcert의 명세를 대대적으로 개편함
  • SSL 압축 지원을 제거함
  • 버전 2 와이어 프로토콜에 대한 서버 및 libpq 지원을 제거함
  • CREATE/DROP LANGUAGE 명령에서 언어 이름의 단일 따옴표 사용을 금지함
  • 시퀀스와 토스트 테이블에 대해 이전에 생성된 복합 타입(composite types)을 제거함
  • ecpg SQL 명령 문자열에서 중복된 따옴표 처리를 수정함
  • intarray의 포함 연산자(<@ 및 @>)가 GiST 색인을 사용하지 못하도록 변경함
  • contrib 프로그램 pg_standby를 제거함
  • tablefunc의 함수 normal_rand()가 음수 값을 받지 못하도록 변경함

 

변경 사항

Server 

  • pg_read_all_data 및 pg_write_all_data 라는 사전 정의된 역할을 추가함
  • 현재 데이터베이스 소유자만 포함하는 pg_database_owner라는 사전 정의된 역할을 추가함
  • 백엔드 충돌 후 임시 파일을 제거함
  • 클라이언트가 연결이 끊어지면 장기 실행 쿼리를 취소할 수 있도록 허용함. 서버 매개변수인 client_connection_check_interval을 통해 여부를 확인할 수 있음
  • pg_terminate_backend()에 선택적 타임아웃 매개변수를 추가함
  • 거의 비어 있는 힙 페이지에 항상 넓은 튜플 추가를 허용함
  • SSL 연결 패킷에 서버 이름 표시(SNI)를 추가함

Vacuuming

  • 배큠이 제거 가능한 인덱스 항목 수가 미미할 경우 인덱스 배큠을 건너뛸 수 있도록 허용함
  • 배큠이 삭제된 비트리 페이지를 더 적극적으로 free space map(FSM)에 추가할 수 있도록 허용함
  • 배큠이 사용되지 않는 후행 힙 라인 포인터가 사용한 공간을 회수할 수 있도록 함
  • 배큠이 최소 잠금 인덱스 작업 중 데드 튜플을 더 공격적으로 제거할 수 있도록 허용함
  • 많은 테이블을 가진 DB의 배큠 속도를 향상함
  • vacuum_cost_page_miss의 기본값이 현재 하드웨어 능력을 더 잘 반영하도록 줄임
  • TOAST 테이블의 배큠 건너뛰기 기능을 추가함
  • COPY FREEZE가 페이지 가시성 비트(visibility bits)를 적절하게 업데이트하도록 함
  • 테이블이 xid 또는 multixact wraparound에 근접한 경우 배큠 작업을 더 공격적으로 수행하도록 함
    • vacuum_failsafe_age 및 vacuum_multixac_failsafe_age로 제어
  • 오토배큠 로깅 출력에 인덱스별 정보 추가함

Partitioning

  • 많은 파티션을 가진 파티션된 테이블에서 업데이트 및 삭제의 성능이 개선됨
  • 파티션을 차단하지 않는 방식으로 분리할 수 있도록 허용함
    • ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY 및 FINALIZE
  • 파티션 경계 값에서 COLLATE 절을 무시함

Index

  • 비트리 인덱스 추가가, 만료된 인덱스 항목을 제거하여 페이지 분할을 방지하도록 함
  • BRIN 인덱스가 범위별로 여러 최소/최대 값을 기록할 수 있도록 허용함
  • BRIN 인덱스가 블룸 필터를 사용할 수 있도록 허용함
  • 일부 GiST 인덱스를 데이터 사전 정렬을 통해 구축할 수 있도록 허용함
  • SP-GiST 인덱스가 INCLUDE된 열을 포함할 수 있도록 허용함

Optimizer

  • IN 절에서 많은 상수에 대한 해시 조회를 허용함
  • OR 절 추정(estimation)을 위한 확장 통계 사용 가능한 위치 수를 증가함
  • 표현식에 대한 확장 통계를 허용함
    • pg_stats_ext_exprs 뷰 참고
  • TID 범위의 효율적인 힙 스캐닝을 허용함
  • EXPLAIN CREATE TABLE AS 및 EXEPLAIN CREATE MATERIALIZED VIEW가 IF NOT EXISTS를 존중하도록 수정함

General Performance

  • 많은 CPU와 높은 세션 수를 가진 시스템에서 MVCC 가시성 스냅샷 계산 속도가 개선됨
  • nl조인의 내부에서 결과를 기억하는 실행기 메소드를 추가함
  • 윈도우 함수가 증분 정렬을 수행할 수 있도록 허용함
  • 병렬 순차 스캔의 I/O 성능이 개선됨
  • 여러 외부 테이블을 참조하는 쿼리가 외부 테이블 스캔을 병렬로 수행할 수 있도록 허용함
    • postgres_fdw는 async_capable이 설정되어야 함
  • analyze가 페이지 prefetching에 의해 제어되도록 함
  • 정규 표현식 검색 성능이 개선됨
  • 유니코드 정규화 성능을 크게 향상함
  • TOAST 데이터에 LZ4 압축 사용이 가능함
    • default_toast_compression을 통해 가능함
    • 기본 설정은 pglz임
    • 서버가 --with-lz4로 컴파일되어야 사용 가능함

Monitoring

  • 서버 파라미터인 compute_query_id가 활성화되면 pg_stat_activity, EXPLAIN VERBOSE, csvlog 및 선택적으로 log_line_prefix에서 쿼리 ID를 표시할 수 있음
  • 오토배큠 및 auto-analyze의 로깅을 개선함
    • track_io_timing이 활성화된 경우 I/O 타이밍을 보고함
  • 클라이언트에 의해 제공된 원래 사용자 이름에 대한 정보를 log_connections 출력에 추가함

System Views

  • COPY 진행 상황 보고를 위한 시스템 뷰 pg_stat_progess_copy가 추가됨
  • WAL 활동을 보고하는 시스템 뷰 pg_stat_wal이 추가됨
  • 복제 슬롯 활동을 보고하는 시스템 뷰 pg_stat_replication_slots가 추가됨
  • 세션 메모리 사용량을 보고하는 시스템 뷰 pg_backend_memory_contexts를 추가함
    • pg_log_backend_memory_contexts()는 임의의 백엔드의 메모리 컨텍스트를 출력함
  • pg_stat_database 시스템 뷰에 세션 통계 추가
  • pg_locks에 잠금 대기 시작 시간 추가함
  • WAL 수신자 종료 대기 시간을 보고하는 대기 이벤트 WalReceiverExit를 추가함
  • 정보 스키마 뷰 routine_column_usage를 구현하여 함수 및 절차의 기본 표현식에 의해 참조된 열을 추적하도록 함

Authentication

  • SSL 인증서의 고유 이름(DN)을 클라이언트 인증서 인증에 매치할 수 있도록 허용함
  • pg_hba.conf 및 pg_ident.conf 레코드가 여러 줄에 걸쳐 있을 수 있도록 허용함
  • 인증서 철회 목록(CRL) 디렉토리의 명세를 허용함
  • 임의 길이의 비밀번호를 허용함

Server Configuration

  • 유휴 세션을 닫기 위한 서버 매개변수 idle_session_timeout이 추가됨
    • idle_in_transaction_session_timeout과 유사함
  • checkpoint_completion_target 기본값을 0.5 > 0.9로 변경함
  • log_line_prefix에 %P를 사용하여 병렬 작업자의 병렬 그룹 리더 PID 보고를 허용함
  • unix_socket_directories에 개별적인 쉼표로 구분된 따옴표로 묶인 문자열로 경로 지정을 허용함
  • 시작 시 동적 공유 메모리 할당을 허용함
    • min_dynamic_shared_memory에 의해 제어됨
  • 리눅스에서 사용되는 거대 페이지(huge page)의 크기를 제어하는 서버 매개변수 huge_page_size를 추가함

Streaming Replication And Recovery

  • standby 서버를 pg_rewind에 의해 되감을(rewound) 수 있도록 허용함
  • 서버 리로드 중 restore_command  설정을 변경할 수 있도록 허용함
  • 긴 복구 충돌 대기 시간을 보고하는 서버 매개변수인 log_recovery_conflict_waits를 추가함
  • 주 서버가 스탠바이에서 재생을 방지하는 방식으로 매개변수를 변경할 경우 핫 스탠바이 서버의 복구를 즉시 중단에서 일시 중단으로 변경함
  • 복구 상태를 보고하는 함수 pg_get_wal_replay_pause_state()를 추가함
    • pg_is_wal_replay_paused()보다 더 상세한 정보를 제공함
  • 읽기 전용 서버 매개변수인 in_hot_standby가 추가됨
  • 클러스터에 많은 공유 버퍼가 있는 경우 복구 중 작은 테이블의 절단(trunaction) 속도가 향상됨
  • 리눅스에서 충돌 복구 시작 시 파일 시스템 동기화를 허용함
  • 지정된 트랜잭션의 커밋 타임스탬프와 복제 원점을 반환하는 함수 pg_xact_commit_timestamp_origin()을 추가함
  • 표준 함수 권한 제어를 사용하여 복제 원점 함수 제어를 허용함

Logical Replication

  • 진행 중인 긴 트랜잭션을 구독자에게 스트리밍할 수 있도록 논리적 복제를 허용함
  • 진행 중인 큰 트랜잭션을 스트리밍할 수 있도록 논리적 복제 API를 개선함
  • 논리적 복제 중 테이블 동기화에서 여러 트랜잭션을 허용함
  • 즉시 WAL-로그 하위 트랜잭션 및 최상위 XID를 연결함
  • 논리적 디코딩 API를 개선하여 두 단계 커밋 처리를 하도록 함
    • pg_create_logical_replication_slot()을 통해 제어됨
  • 논리적 복제를 사용할 때 명령 완료 시 WAL에 캐시 무효화(invalidation) 메시지를 추가함
  • 논리적 디코딩이 캐시 무효화를 메시지를 보다 효율적으로 처리할 수 있도록 함
  • 논리적 디코딩 메시지가 복제 스트림으로 전송되는지 여부를 제어하도록 허용함
  • 논리적 복제 구독이 바이너리 전송 모드를 사용할 수 있도록 허용 함
  • 논리적 디코딩을 xid에 의해 필터링할 수 있도록 허용함

SELECT, INSERT

  • AS 없이 열 레이블로 사용할 수 없는 키워드를 감소함
  • JOIN의 USING 절에 별칭을 지정할 수 있도록 허용함
  • GROUP BY에 DISTINCT를 추가하여 GROUPING SET 조합의 중복을 제거할 수 있도록 허용 함
  • INSERT의 다중 행 VALUES 목록에 DEFAULT 항목을 올바르게 처리하도록 함
  • CTE에 대한 SQL 표준 SEARCH 및 CYCLE 절을 추가함
  • ON CONFLICT의 WHERE 절에서 열 이름을 테이블로 한정할 수 있도록 허용

Utility Commands

  • REFRESH MATERAILIZED VIEW가 병렬 처리를 사용할 수 있도록 허용함
  • REINDEX가 TATBLESPACE절을 지정하여 새 인덱스의 테이블스페이스를 변경할 수 있도록 허용함
  • REINDEX가 파티션된 테이블의 모든 자식 테이블 또는 인덱스를 처리할 수 있도록 허용함
  • CONCURRENTLY를 사용하는 인덱스 명령이 CONCURRENTLY를 사용하는 다른 작업의 완료를 기다리지 않도록 허용함
  • 바이너리 모드에서 COPY FROM의 성능이 개선됨
  • 뷰 정의에서 SQL 표준 문법을 유지하도록 개선함
  • GRANT 및 REVOKE에 SQL 표준 절 GRANTED BY를 추가함
  • CREATE TRIGGER에 OR REPLACE 옵션을 추가함
  • 외부 테이블에서 TRUNCATE 작업을 수행할 수 있도록 허용함
    • postgres_fdw 모듈도 이제 이를 허용함
  • 구독에 출판물(publication)을 쉽게 추가하거나 제거할 수 있도록 허용함
    • ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION을 통해 가능함
  • 시스템 카탈로그에 기본 키, 고유 제약 조건, 외래 키를 추가함
    • pg_get_catalog_foreign_keys()에서 알 수도 있음
  • CURRENT_USER가 허용되는 모든 곳에서 CURRENT_ROLE 사용도 허용됨

Data Types

  • 확장 및 내장 데이터 타입이 subscripting을 구현할 수 있도록 허용함
  • JSONB의 subscripting을 허용함
  • multirange 데이터 타입 지원을 추가함
  • tsearch 데이터 파일의 라인 길이에 제한이 없도록 허용함
  • numeric 데이터 타입에서 Infinity 및 -Infinity 값 지원을 추가함
  • LSN 및  숫자(바이트) 값을 더하고 빼는 연산자를 추가함
  • 배열 및 레코드 OID 불일치에 대해 이진 데이터 전송이 더 관대하도록 허용함

Functions

  • SQL 언어 함수 및 프로시저가 SQL 표준 함수 본문을 사용할 수 있도록 허용 함
  • 프로시저가 OUT 매개변수를 가질 수 있도록 허용함
  • 일부 배열 함수가 호환 가능한 데이터 타입의 혼합에서 작동할 수 있도록 허용(상단의 개요 항목 참고)
  • SQL 표준 trim_array() 함수가 추가됨
  • split_part()에서 음수 인덱스를 지원함
  • 구분자를 사용하여 문자열을 분할하는 string_to_table() 함수를 추가함
    • regexp_split_to_table()과 유사함
  • XOR 집계 함수인 bit_xor()가 추가됨
  • 비트 또는 바이트 문자열에서 설정된 비트 수를 반환하는 함수 bit_count()가 추가됨
  • date_bin() 함수가 추가됨
  • make_timestamp(), make_timestamptz()가 음수 연도를 허용하도록 변경됨. 음수 값은 BC 연도로 해석함
  • 새로운 SQL 표준 정규 표현식으로 substring() 문법이 추가됨
  • 정규 표현식 괄호 내에 \D, \S, \W의 보완된 문자 클래스 이스케이프를 허용함
  • lead() 및 lag() 윈도우 함수의 기본값에 대해 보다 유연한 데이터 타입을 허용함
  • 0이 아닌 부동 소수점 값을 무한대로 나누면 0을 반환하도록 변경함
  • NaN을 0으로 나누는 부동 소수점 나눗셈이 에러가 아닌 NaN을 반환하도록 함
  • 음수 무한대 지수에 대한 exp() 및 power()가 언더플로우 오류가 아닌 0을 반환하도록 변경함
  • 무한대를 포함하는 기하학적 계산의 정확도를 개선함
  • pg_describe_object(), pg_identfify_object() 및 pg_identify_object_as_address()가 존재하지 않는 객체에 대해 항상 유용한 오류 메시지를 보고하도록 변경됨

PL/PgSQL

  • PL/pgSQL의 표현식 및 할당 구문 분석을 개선함
  • PL/pgSQL의 RETURN QUERY가 쿼리를 병렬 처리를 사용하여 실행할 수 있도록 허용함
  • PL/pgSQL 절차 내에서 반복적인 CALL의 성능을 개선함

Client Interfaces

  • libpq에 파이프라인 모드를 추가함
  • libpq의 target_session_attrs 매개변수 옵션을 강화함

Client Applications

  • vacuumdb가 인덱스 정리 및 축소를 건너뛸 수 있도록 허용함
    • --no-index-cleanup 및 --no-truncate 옵션으로 제어
  • pg_dump가 특정 확장만 덤프할 수 있도록 허용함
  • pgbench가 값의 무작위 순서 변경을 위한 permute() 함수를 추가함
  • -C 옵션을 사용할 때 pgbech의 재연결 오버헤드 측정에 연결 해제 시간을 포함함
  • pg_dump, pg_dumpall 및  pg_restore에서 다중 verbose 옵션 지정(-v)을 통해 로깅 세부도를 높일 수 있도록 허용함

psql

  • psql의 \df 및 \do 명령이 함수 및 연산자 인자 유형을 지정할 수 있도록 허용함
  • psql의 \dt 및 \di가 TOAST 테이블과 그 인덱스를 표시하도록 허용함
  • 확장 통계 객체를 나열하는 PSQL 명령어 \dX를 추가함
  • psql의 \dT가 배열 구문과 백엔드 문법 별칭을 이해하도록 수정함. 예를 들어 int를 integer로 함
  • 탭 자동 완성 기능을 개선함

Server Applications

  • 많은 테이블에 대한 contrib/amcheck 테스트를 단순화하기 위해 CLI 유틸리티인 pg_amcheck가 추가됨
  • initdb에 --no-instructions 옵션을 추가함
  • postmaster에 -o 옵션 지원이 중단됨

Documentation

  • "Default Roles"를 "Predefined Roles"로 이름을 변경함
  • factorial() 함수에 대한 문서를 추가함

Source Code

  • SSL 라이브러리 선택을 위한 구성 옵션인 --with-ssl={openssl}이 추가됨
    • 호환성을 위해 --with-openssl 표기도 유지됨
  • 추상적인 Unix-domain 소켓 지원이 추가됨
  • 윈도우 OS에서 4GB를 초과하는 파일을 적절하게 처리할 수 있또록 허용함
  • 테스트 목적으로 캐시 플러싱(flushing)을 제어하는 서버 매개변수 debug_discard_caches가 추가됨
  • SHA1, SHA2 및 MD5 해시 계산이 OpenSSL EVP API를 사용하도록 변경됨
  • FreeBSD에 대한 콜레이션 버전 지원을 추가함

Additional Modules

  • hstore 값에 대한 subscripting을 허용함
  • GiST/GIN pg_trgm 인덱스가 "=" 조회를 수행할 수 있도록 허용함
  • cube 데이터 타입이 이진 모드로 전송될 수 있도록 허용됨
  • pgstattuple_approx()가 TOAST 테이블에 대한 보고를 할 수 있도록 허용함
  • 행 가시성을 변경할 수 있도록 하는 contirb 모듈 pg_surgery가 추가됨
  • 활성된 old_snapshot_threshold에 의해 사용된 XID/시간 매핑을 보고하는 contrib 모듈인 old_snapshot이 추가됨
  • amcheck가 힙 페이지도 검사할 수 있도록 허용함
  • pageinspect가 GiST 인덱스를 검사할 수 있도록 허용함
  • pageinspect 블록 번호를 bigint로 변경함
  • bitree_gist 함수를 병렬 안전으로 표시함

pg_stat_statements

  • 쿼리 해사 계산을 pg_stat_statements에서 코어 서버로 이동함
  • pg_stat_statements가 상위 및 중첩 문장을 별도로 추적하도록 변경함
  • pg_stat_statements에 유틸리티 명령의 행 수를 추가함
  • pg_stat_statements 활동을 보여주는 pg_stat_statements_info 시스템 뷰를 추가함

postgres_fdw

  • postgres_fdw가 대량으로 행을 삽입할 수 있도록 허용함
  • postgres_fdw가 IMPORT FOREIGN SCHEMA ... LIMIT TO에 의해 지정된 테이블 파팃녀을 가져올 수 있도록 허용함
  • postgres_fdw 함수인 postgres_fdw_get_connections()를 추가하여 열린 외부 서버 연결을 보고할 수 있도록 함
  • 트랜잭션 완료 후 외부 서버가 연결을 유지하는지 여부를 제어할 수 있도록 허용함
    • keep_connections에 의해 제어되며 기본값은 on임
  • postgres_fdw가 필요에 따라 외부 서버 연결을 재설정할 수 있도록 허용함
  • postgres_fdw 함수를 추가하여 캐시된 연결을 폐기하도록 함

 

참고

 
728x90
반응형