PostgreSQL SELECT DISTINCT
성능 병목 현상 및 최적화 전략
약 200만 개의 레코드가 포함된 PostgreSQL 테이블에 대한 SELECT DISTINCT
쿼리는 예기치 않게 느린 성능(500-600ms)을 나타냅니다. 쿼리 플래너는 설명할 수 없을 정도로 기본적으로 사용 가능한 인덱스를 활용하는 대신 순차 스캔을 사용하며 인덱스 강제 적용으로도 실행 시간이 크게 향상되지 않습니다.
PostgreSQL에서 인덱스 건너뛰기 스캔 에뮬레이션
PostgreSQL에는 기본 인덱스 건너뛰기 스캔 기능이 없기 때문에 재귀적 공통 테이블 표현식(CTE)을 사용하는 해결 방법으로 해당 동작을 모방할 수 있습니다. 이 CTE는 효율성을 위해 product_id
의 인덱스를 활용하여 고유한 제품 ID를 오름차순으로 반복적으로 검색합니다.
<code class="language-sql">WITH RECURSIVE cte AS ( ( SELECT product_id FROM tickers ORDER BY 1 LIMIT 1 ) UNION ALL SELECT l.* FROM cte c CROSS JOIN LATERAL ( SELECT product_id FROM tickers t WHERE t.product_id > c.product_id ORDER BY 1 LIMIT 1 ) l ) SELECT * FROM cte;</code>
이 접근 방식은 전체 테이블 스캔에 비해 상당한 성능 향상을 제공합니다.
대체 접근 방식: DISTINCT
및 DISTINCT ON
고유 제품 ID당 행이 더 균등하게 분포된 테이블의 경우 표준 DISTINCT
또는 DISTINCT ON
키워드가 에뮬레이트된 인덱스 건너뛰기 스캔보다 빠를 수 있습니다. 성능은 데이터 배포에 크게 좌우됩니다.
향후 개선 사항: 기본 인덱스 건너뛰기 스캔
PostgreSQL 개발에는 기본 인덱스 건너뛰기 스캔 기능을 통합하기 위한 지속적인 작업이 포함되어 있습니다. 이 향후 개선 사항은 SELECT DISTINCT
쿼리
위 내용은 PostgreSQL SELECT DISTINCT 쿼리가 너무 느린 이유는 무엇이며 성능을 어떻게 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!