PostgreSQL과 같은 대규모 데이터베이스에서 행을 무작위로 선택하는 것은 성능 집약적인 작업일 수 있습니다. 이 기사에서는 이 목표를 효율적으로 달성하는 두 가지 일반적인 방법을 살펴보고 각 방법의 장점과 단점을 논의합니다.
<code class="language-sql">select * from table where random() < 0.01;</code>
이 방법은 행을 무작위로 정렬한 다음 임계값을 기준으로 필터링합니다. 그러나 전체 테이블 스캔이 필요하며 대규모 데이터 세트의 경우 속도가 느려질 수 있습니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!