# 포스트그레스(Postgres) 16 쿼리 플래너의 새로운 기능

> Clean Markdown view of GeekNews topic #13302. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=13302](https://news.hada.io/topic?id=13302)
- GeekNews Markdown: [https://news.hada.io/topic/13302.md](https://news.hada.io/topic/13302.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-02-11T10:05:59+09:00
- Updated: 2024-02-11T10:05:59+09:00
- Original source: [citusdata.com](https://www.citusdata.com/blog/2024/02/08/whats-new-in-postgres-16-query-planner-optimizer/)
- Points: 1
- Comments: 1

## Topic Body

### PostgreSQL 16 쿼리 플래너의 새로운 기능
- PostgreSQL 16은 쿼리 플래너에 많은 개선을 도입하여 많은 SQL 쿼리들이 이전 버전보다 더 빠르게 실행됨.
- PG16 릴리스 노트에서 이러한 플래너 개선 사항을 볼 수 있지만, PostgreSQL 릴리스마다 변경 사항이 많아 각 변경 사항에 대한 자세한 설명을 제공하기 어려움.
- 이 블로그 포스트에서는 PostgreSQL 16 쿼리 플래너에서 이루어진 10가지 개선 사항에 대한 깊은 분석을 제공하며, PG15와 PG16 플래너 출력의 비교와 함께 변경된 사항에 대한 예제를 제공함.

### PostgreSQL 16 쿼리 플래너의 10가지 개선 사항
- **증분 정렬**: PostgreSQL 13에서 처음 도입된 증분 정렬은 일부 결과 집합이 이미 하나 이상의 선행 열로 정렬되어 있는 경우 이를 활용하여 나머지 열에 대해서만 정렬을 수행함.
- **정렬된 데이터를 사용하는 집계**: PostgreSQL 16 쿼리 플래너는 이제 집계 노드에 정렬된 순서대로 행을 공급하는 계획을 형성하려고 시도함.
- **메모이제이션**: PostgreSQL 14에서 처음 도입된 메모이제이션 계획 노드는 중복된 값 조회를 피하기 위해 캐시 계층으로 작동함.
- **안티 조인**: PostgreSQL 16은 안티 조인을 수행할 때 더 작은 테이블을 해시할 수 있도록 함.
- **병렬 해시 조인**: PostgreSQL 16은 FULL 및 RIGHT 조인 유형에 대한 병렬 해시 조인을 지원함.
- **윈도우 함수 최적화**: PostgreSQL 16은 ROWS 모드를 사용할 때 RANGE 모드보다 빠른 윈도우 함수를 사용할 수 있도록 함.
- **항상 증가하는 윈도우 함수 최적화**: PostgreSQL 16은 ntile(), cume_dist(), percent_rank() 등의 윈도우 함수에 대한 최적화를 확장함.
- **파티션 테이블에서의 조인 제거**: PostgreSQL 16은 파티션 테이블에서 LEFT JOIN 제거 최적화를 허용함.
- **DISTINCT 쿼리에 대한 Limit 사용**: PostgreSQL 16 쿼리 플래너는 모든 행이 동일한 값을 포함하고 있음을 감지할 수 있을 때 결과의 중복 제거를 위한 계획 노드를 포함하지 않음.
- **Merge Join에 대한 규칙 완화**: PostgreSQL 16 쿼리 플래너는 Merge Join을 고려할 때 행의 순서가 정확히 일치하는 대신 최소한 하나의 선행 열이 올바르게 정렬되어 있는지 확인함.

### GN⁺의 의견
- PostgreSQL 16의 쿼리 플래너 개선은 데이터베이스 성능 향상에 중요한 역할을 함. 특히 증분 정렬과 메모이제이션 같은 기능은 복잡한 쿼리를 더 효율적으로 실행할 수 있게 해줌.
- 이러한 개선 사항들은 PostgreSQL을 사용하는 개발자와 데이터베이스 관리자에게 매우 유용할 것이며, 특히 대규모 데이터를 다루는 시스템에서 성능 개선을 체감할 수 있을 것임.
- PostgreSQL 커뮤니티의 지속적인 혁신과 개선 노력은 오픈 소스 데이터베이스 기술의 발전을 이끌고 있으며, 이는 사용자와 기업에게 더 나은 데이터 관리 솔루션을 제공함.

## Comments



### Comment 22992

- Author: neo
- Created: 2024-02-11T10:05:59+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=39310837) 
- 포스트그레스(Postgres) 쿼리 플래너가 실행 중간에 쿼리를 재계획할 수 있으면 좋겠다는 의견이 있음. 데이터 분포에 대한 정보가 부족해 비효율적인 쿼리 계획이 수립되고, 이로 인해 실행 시간에 큰 영향을 미칠 수 있음. 쿼리가 예상보다 느리게 진행될 경우 현재 진행 정보를 바탕으로 쿼리를 재계획하는 기능이 필요함. 그러나 포스트그레스는 스트리밍 쿼리를 지원하기 때문에, 실행 중간에 계획을 변경하는 것은 상당한 인프라 변경을 요구함.
- 쿼리 시각화 도구로 `explain.dalibo.com`과 `www.pgexplain.dev`를 사용한다는 사용자가 있음. 두 도구 모두 유사한 출력 결과를 제공함.
- 쿼리 플래너 개선은 데이터베이스에서 중요한 부분이지만, 주로 원하는 대로 작동하지 않을 때 눈에 띈다는 의견이 있음. 최신 포스트그레스 버전의 JIT(Just-In-Time) 컴파일러는 사용 시점의 휴리스틱이 강건하지 않아 보이며, 작은 데이터에 대해 느려질 수 있어 JIT를 비활성화하는 것이 좋다는 경험을 공유함.
- 실제 쿼리에서 얼마나 자주 변경사항이 효과가 있는지, 특히 "가능할 때 DISTINCT 대신 Limit을 사용"하는 변경이 실제로 적용되는 경우가 있는지 궁금하다는 의견이 있음. 포스트그레스 개발자들이 이에 대한 정보를 가지고 있는지에 대한 질문이 있음.
- 애플리케이션 테스팅을 위한 "엄격 모드"가 있으면 좋겠다는 의견이 있음. 이 모드에서는 쿼리를 개선할 수 있는 인덱스가 없을 경우 오류를 반환하며, "CREATE INDICES FOR &lt;sql&gt;" 명령어를 통해 필요한 인덱스를 생성할 수 있음. 개발 및 대화형 사용을 위한 자동 인덱스 생성 모드도 제안됨.
- 한 사용자의 친구가 중소기업을 위한 마이크로소프트 DBA로 일하며, 포스트그레스로는 심각한 작업을 할 수 없다고 주장함. 포스트그레스에 쿼리 플래너가 없다는 사실에 놀랐다고 하나, 이는 잘못된 정보임. MSSQL이 포스트그레스보다 더 큰 규모의 작업을 처리할 수 있다는 주장에 대한 신빙성에 대한 질문이 있음.
- 포스트그레스가 힌트(hints)를 구현하지 않는 이유에 대한 의문이 제기됨.
- Citus Data가 발표한 기능이 왜 postgresql.org가 아닌 다른 곳에서 나왔는지, 유료 기능인지 아니면 오픈 소스 추가 기능인지에 대한 질문이 있음.
- 포스트그레스가 `IS NOT DISTINCT FROM` 쿼리를 가속화하기 위해 인덱스를 사용할 수 있는 시점에 대한 질문이 있음.
- 한 댓글이 신고되어 플래그(flagged) 처리됨.
