집 >데이터 베이스 >MySQL 튜토리얼 >대규모 PostgreSQL 테이블에서 무작위 행을 효율적으로 선택하는 방법은 무엇입니까?
대규모 데이터 세트로 작업할 때 임의의 행을 선택하는 것은 계산 집약적인 작업일 수 있습니다. 이 기사에서는 약 5억 개의 행이 포함된 테이블에서 임의의 행을 검색하는 다양한 방법을 살펴보고 해당 방법의 성능과 정확성에 대해 논의합니다.
첫 번째 방법은 RANDOM() 함수를 사용하여 난수를 생성한 다음 LIMIT 절을 사용하여 결과를 필터링하여 필요한 행 수를 얻는 것입니다.
<code class="language-sql">SELECT * FROM table WHERE RANDOM() < 0.000002 LIMIT 1000;</code>
이 접근 방식은 구현하기 쉽다는 장점이 있지만 큰 테이블에는 비효율적일 수 있습니다. LIMIT 절로 인해 데이터베이스는 테이블의 모든 행을 스캔하여 임의의 행을 선택하고 나머지는 삭제해야 합니다.
또 다른 접근 방식은 먼저 RANDOM() 함수를 사용하여 행을 정렬한 다음 LIMIT 절을 사용하여 임의의 행을 가져오는 것입니다.
<code class="language-sql">SELECT * FROM table ORDER BY RANDOM() LIMIT 1000;</code>
이 방법은 첫 번째 방법과 유사하지만 정렬을 통해 임의 행을 보다 효율적으로 선택할 수 있습니다. 필요한 스캔 수가 줄어들어 큰 테이블에 더 나은 선택이 됩니다. 그러나 행 수가 매우 많은 테이블에는 여전히 최선의 선택이 아닙니다.
숫자 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!