> 데이터 베이스 > MySQL 튜토리얼 > 대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하려면 어떻게 해야 합니까?

대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2025-01-21 05:37:09
원래의
881명이 탐색했습니다.

How Can I Efficiently Select Random Rows from a Large PostgreSQL Table?

PostgreSQL과 같은 대규모 데이터베이스에서 행을 무작위로 선택하는 것은 성능 집약적인 작업일 수 있습니다. 이 기사에서는 이 목표를 효율적으로 달성하는 두 가지 일반적인 방법을 살펴보고 각 방법의 장점과 단점을 논의합니다.

방법 1: 임의의 값으로 필터링

<code class="language-sql">select * from table where random() < 0.01;</code>
로그인 후 복사

이 방법은 행을 무작위로 정렬한 다음 임계값을 기준으로 필터링합니다. 그러나 전체 테이블 스캔이 필요하며 대규모 데이터 세트의 경우 속도가 느려질 수 있습니다.

방법 2: 임의의 값으로 정렬하고 결과를 제한합니다

<code class="language-sql">select * from table order by random() limit 1000;</code>
로그인 후 복사

이 방법은 행을 무작위로 정렬하고 상위 n개 행을 선택합니다. 첫 번째 방법보다 성능은 좋지만 제한 사항이 있습니다. 행 그룹에 행이 너무 많으면 임의의 하위 집합을 선택하지 못할 수 있습니다.

대규모 데이터 세트에 대한 최적화 솔루션

행 수가 많은 테이블(예: 5억 행)의 경우 다음 접근 방식이 최적화된 솔루션을 제공합니다.

<code class="language-sql">WITH params AS (
   SELECT 1       AS min_id,           -- 最小ID(小于等于当前最小ID)
        5100000 AS id_span          -- 四舍五入。(max_id - min_id + buffer)
    )
SELECT *
FROM  (
   SELECT p.min_id + trunc(random() * p.id_span)::integer AS id
   FROM   params p
        , generate_series(1, 1100) g  -- 1000 + buffer
   GROUP  BY 1                        -- 去除重复项
) r
JOIN   big USING (id)
LIMIT  1000;                          -- 去除多余项</code>
로그인 후 복사

이 쿼리는 효율적인 검색을 위해 ID 열의 인덱스를 활용합니다. ID 공간 내에서 일련의 난수를 생성하여 ID가 ​​고유한지 확인하고 데이터를 기본 테이블과 조인하여 필요한 행 수를 선택합니다.

기타 고려사항

경계 쿼리:
난수 생성 시 큰 버퍼가 필요하지 않도록 하려면 테이블 ID 열에 간격이 상대적으로 적어야 합니다.

구체화된 보기:
무작위 데이터에 반복적으로 액세스해야 하는 경우 구체화된 뷰를 생성하여 성능을 향상시키는 것을 고려하십시오.

PostgreSQL 9.5용 테이블 샘플 시스템:
PostgreSQL 9.5에 도입된 이 최적화 기술을 사용하면 지정된 비율의 행을 빠르게 샘플링할 수 있습니다.

위 내용은 대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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