>데이터 베이스 >MySQL 튜토리얼 >대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하는 방법은 무엇입니까?

대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-21 05:46:12618검색

How to Efficiently Select Random Rows from a Large PostgreSQL Table?

대형 PostgreSQL 테이블에서 임의의 행 선택

대규모 데이터 세트로 작업할 때 임의의 행을 선택하는 것은 계산 집약적인 작업일 수 있습니다. 이 기사에서는 약 5억 개의 행이 포함된 테이블에서 임의의 행을 검색하는 다양한 방법을 살펴보고 해당 방법의 성능과 정확성에 대해 논의합니다.

방법 1: RANDOM() 및 LIMIT 사용

첫 번째 방법은 RANDOM() 함수를 사용하여 난수를 생성한 다음 LIMIT 절을 사용하여 결과를 필터링하여 필요한 행 수를 얻는 것입니다.

<code class="language-sql">SELECT * FROM table WHERE RANDOM() < 0.000002 LIMIT 1000;</code>

이 접근 방식은 구현하기 쉽다는 장점이 있지만 큰 테이블에는 비효율적일 수 있습니다. LIMIT 절로 인해 데이터베이스는 테이블의 모든 행을 스캔하여 임의의 행을 선택하고 나머지는 삭제해야 합니다.

방법 2: ORDER BY RANDOM() 및 LIMIT 사용

또 다른 접근 방식은 먼저 RANDOM() 함수를 사용하여 행을 정렬한 다음 LIMIT 절을 사용하여 임의의 행을 가져오는 것입니다.

<code class="language-sql">SELECT * FROM table ORDER BY RANDOM() LIMIT 1000;</code>

이 방법은 첫 번째 방법과 유사하지만 정렬을 통해 임의 행을 보다 효율적으로 선택할 수 있습니다. 필요한 스캔 수가 줄어들어 큰 테이블에 더 나은 선택이 됩니다. 그러나 행 수가 매우 많은 테이블에는 여전히 최선의 선택이 아닙니다.

효율적인 접근 방식: 숫자 ID 열과 인덱스 사용

숫자 ID 열이 있고 간격이 적은 테이블의 경우 더 효율적인 접근 방식을 사용할 수 있습니다. 여기에는 ID 범위 내에서 난수를 생성하고 이를 사용하여 테이블과 조인하는 작업이 포함됩니다.

<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   table USING (id)
LIMIT  1000;</code>

이 접근 방식은 인덱스 액세스를 활용하여 필요한 스캔 수를 크게 줄입니다. 행 수가 많고 ID 열에 간격이 거의 없는 테이블에 이상적입니다.

고려사항 및 권장사항

임의의 행을 선택하는 가장 좋은 방법은 특정 테이블 특성 및 성능 요구 사항에 따라 다릅니다. 작은 테이블의 경우 RANDOM() 또는 ORDER BY RANDOM() 메서드로 충분할 수 있습니다. 그러나 숫자 ID 열이 있고 간격이 거의 없는 대규모 테이블의 경우 최상의 성능을 위해 위의 최적화 방법을 사용하는 것이 좋습니다.

컴퓨터의 의사 난수 생성 특성으로 인해 이러한 방법 중 어느 것도 진정한 무작위성을 보장할 수 없다는 점에 유의해야 합니다. 그러나 이는 합리적인 효율성과 정확성으로 큰 테이블에서 임의의 행 샘플을 얻는 실용적인 방법을 제공합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.