> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL SELECT DISTINCT 쿼리가 너무 느린 이유는 무엇이며 성능을 어떻게 향상시킬 수 있습니까?

PostgreSQL SELECT DISTINCT 쿼리가 너무 느린 이유는 무엇이며 성능을 어떻게 향상시킬 수 있습니까?

Barbara Streisand
풀어 주다: 2025-01-07 18:17:40
원래의
177명이 탐색했습니다.

Why is my PostgreSQL SELECT DISTINCT query so slow, and how can I improve its performance?

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>
로그인 후 복사

이 접근 방식은 전체 테이블 스캔에 비해 상당한 성능 향상을 제공합니다.

대체 접근 방식: DISTINCTDISTINCT ON

고유 제품 ID당 행이 더 균등하게 분포된 테이블의 경우 표준 DISTINCT 또는 DISTINCT ON 키워드가 에뮬레이트된 인덱스 건너뛰기 스캔보다 빠를 수 있습니다. 성능은 데이터 배포에 크게 좌우됩니다.

향후 개선 사항: 기본 인덱스 건너뛰기 스캔

PostgreSQL 개발에는 기본 인덱스 건너뛰기 스캔 기능을 통합하기 위한 지속적인 작업이 포함되어 있습니다. 이 향후 개선 사항은 SELECT DISTINCT 쿼리

에 대한 추가 성능 최적화를 약속합니다.

위 내용은 PostgreSQL SELECT DISTINCT 쿼리가 너무 느린 이유는 무엇이며 성능을 어떻게 향상시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿