본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | PostgreSQL 16 Release - New Feature (1)

by EXEM 2023. 11. 30.

 

 

 

2023년 9월 14일 PostgreSQL Global Development Group은 최신 버전의 PostgreSQL 16을 출시하였습니다. PostgreSQL 16의 주요 기능은 아래와 같습니다.

📢 PostgreSQL 릴리즈 현황은 DB 인사이드 | PostgreSQL Setup - Version & Utility에서 확인할 수 있습니다.

 

 

성능개선

  • 새로운 Query Planner 최적화로 PostgreSQL 기능의 성능 향상
    • FULL OUTER JOIN 및 RIGHT OUTER JOIN의 병렬 처리 가능
    • 집계 함수(ex. string_agg, array_agg) 사용 시 DISTINCT 또는 ORDER BY와 함께 사용할 경우, 쿼리에 대한 더 최적화된 실행 계획 생성
      • enable_presorted_aggregate 파라미터로 제어 가능
    • SELECT DISTINCT 쿼리에 증분 정렬 활용
    • Window Function의 최적화
    • ANTI-JOIN 개선(RIGHT, OUTER)
  • COPY를 사용한 대량 로드(Bulk Loading)의 개선 → 일부 경우에서는 최대 300% 성능 향상
  • 전체 테이블 동결(Freeze)의 필요성을 줄이는 Vacuum 개선
  • RANGE Caching 및 LIST Partition Lookup과 같은 기능을 도입하여 분할된 테이블에 대량의 데이터를 로드하고 Vacuum 및 Analyze를 통해 Shared Buffer 사용량을 보다 효율적으로 제어 가능
    • RANGE 및 LIST 파티션 조회 성능 향상
    • Vacuum과 Analyze를 통해 Shared Buffer 사용량 분석 가능
      • VACUUM BUFFER_USAGE_LIMIT, ANALYZE BUFFER_USAGE_LIMIT 옵션 추가
      • vacuumdb --buffer-usage-limit
      • 기본값은 autovacuum을 제어하는 vacuum_buffer_usage_limit에 의해 설정
  • x86 및 ARM 아키텍처에서 SIMD를 사용하는 CPU 가속 도입
    • ASCII 및 JSON 문자열을 처리, 배열 및 하위 트랜잭션 검색 시 성능 향상

 

Logical Replication

  • Standby Server에서 Logical Replication 수행 가능
    • Physical Replication Standby Server에서 Logical Replication 지원
    • pg_log_standby_snapshot() Function 생성
    • Primary Server 대신 Standby Server를 이용하여 변경 사항을 다른 Standby Server에 게시(Publication) 가능
  • Logical Replication 성능 향상
    • 구독(Subscription)은 Parallel Worker를 사용하여 대규모 트랜잭션 적용 가능
    • Primary Key가 없는 테이블의 경우 구독(Subscription)은 순차적 탐색(Sequential Scan) 대신 B-Tree 인덱스를 사용하여 Row 탐색 가능
    • 특정 조건에서는 Binary 형식을 사용하여 초기 테이블 동기화 속도 향상 가능
  • pg_create_subscription Role 생성
    • Superuser가 아닌 CREATE 권한이 있는 사용자가 CREATE SUBSCRIPTION 가능
  • 양방향 Logical Replication에 대해 지원
    • 서로 다른 게시(Publication)의 두 테이블 간에 데이터를 복제하는 기능 도입

 

사용 편의성

  • JSON_ARRAY(), JSON_ARRAYAGG(), IS JSON과 같은 생성자(Predicate)와 표준 SQL/JSON의 더 많은 구문 추가
  • Subquery Alias 지정 불필요
  • 천 단위 구분 기호로 Underscore 사용 가능 (ex. 5_432_000)
  • psql의 \bind 명령어가 추가되어 매개변수를 포함한 쿼리 수행 가능
  • 텍스트 정렬에 대한 지원 향상
  • libpq를 사용하는 Client의 Load Balancing 지원
    • load_balance_hosts 옵션 추가(Value : random / disable)

 

Monitoring

  • I/O Access Pattern을 세부적으로 분석할 수 있는 pg_stat_io 도입
  • pg_stat_all_tables View에 테이블이나 인덱스가 마지막으로 스캔된 시간을 기록하는 컬럼 추가
    • last_seq_scan
    • last_idx_scan
  • pg_stat_all_tables View에 새로운 Page로 이동하는 업데이트 된 Row 발생에 대한 통계 기록
    • n_tup_newpage_upd
  • 매개변수화된 명령문에 전달된 값을 로깅하여 auto_explain 읽기 쉽게 만들고 pg_stat_statements 및 pg_stat_activity에서 사용하는 쿼리 추적 알고리즘의 정확성을 향상
  • pg_locks View에 추측 잠금 정보(Speculative Lock) 추가
    • 추측성 삽입 잠금은 Transaction ID와 추측성 삽입 토큰으로 구성
      • Transaction ID는 transactionid 컬럼에 표시
      • 추측성 삽입 토큰이 objid 컬럼에 표시

 

보안

  • pg_hba.conf 및 pg_ident.conf 파일 관리 향상
  • 보안 기능 향상
  • GRANT group_name TO user_name이 ADMIN OPTION으로 수행되도록 허용
    • 기존에는 CREATEROLE 권한 필요
  • GRANT 사용 시 WITH ADMIN TRUE/FALSE 구문 허용
    • 기존에는 WITH ADMIN OPTION만 지원
    • 관리자는 보다 구체적인 Role을 정의하고 이에 따라 권한을 할당하여 권한 관리의 간소화

 

PostgreSQL 16 비호환성

  • Primary Key에 대해 NULL NOT DISTINCT 인덱스 허용하지 않음
  • 시스템 카탈로그에서 인덱스를 처리하지 않도록 REINDEX DATABASE 및 reindexdb 변경
    • REINDEX SYSTEM과 reindexdb --system은 사용가능
  • pg_walinspect에서 pg_get_wal_records_info_till_end_of_wal(), pg_get_wal_stats_till_end_of_wal() 함수 제거
  • force_parallel_mode 파라미터를 debug_parallel_query로 이름 변경
  • ON SELECT를 사용하여 수동으로 CREATE VIEW 하는 기능 제거
  • vacuum_defer_cleanup_age 파라미터 제거
    • hot_standby_feedback 및 Replication Slot이 추가되었으므로 불필요
  • promote_trigger_file 파라미터 제거
    • pg_ctl promote 또는 pg_promote()를 사용하면 되므로 불필요
  • Read-Only 서버 변수 lc_collate, lc_ctype 제거
    • Collation과 locale은 Database 마다 다를 수 있으므로 Read-Only 서버 변수로 사용하는 것을 부적절

 

 

 

 

글 | DB 기술기획팀

 

 

 

 

 

 

댓글