집 >데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 임의의 행을 효율적으로 선택하려면 어떻게 해야 합니까?
PostgreSQL은 임의의 행을 효율적으로 선택하기 위한 다양한 방법을 제공합니다.
이 방법은 random()
함수와 LIMIT
절을 사용합니다.
<code class="language-sql">SELECT * FROM table ORDER BY random() LIMIT 1000;</code>
그러나 큰 테이블의 경우 이 방법은 전체 테이블 스캔이 필요하므로 속도가 느려질 수 있습니다.
이 방법은 기본 키 인덱스를 사용하여 쿼리를 최적화합니다.
<code class="language-sql">WITH params AS ( SELECT 1 AS min_id, -- 最小ID (大于等于当前最小ID) , 5100000 AS id_span -- 四舍五入 (max_id - min_id + 缓冲) ) SELECT * FROM ( SELECT p.min_id + trunc(random() * p.id_span)::integer AS id FROM params p , generate_series(1, 1100) g -- 1000 + 缓冲 GROUP BY 1 -- 去除重复项 ) r JOIN table USING (id) LIMIT 1000; -- 去除多余项</code>
이 방법은 전체 테이블 스캔 대신 인덱스 스캔을 사용하기 때문에 첫 번째 방법보다 빠릅니다.
이 방법은 재귀 공통 테이블 표현식(CTE)을 사용하여 ID 열의 누락된 값을 처리합니다.
<code class="language-sql">WITH RECURSIVE random_pick AS ( SELECT * FROM ( SELECT 1 + trunc(random() * 5100000)::int AS id FROM generate_series(1, 1030) -- 1000 + 百分几 - 根据需要调整 LIMIT 1030 -- 查询规划器提示 ) r JOIN table b USING (id) -- 去除缺失值 UNION -- 去除重复项 SELECT b.* FROM ( SELECT 1 + trunc(random() * 5100000)::int AS id FROM random_pick r -- 加上百分几 - 根据需要调整 LIMIT 999 -- 小于1000,查询规划器提示 ) r JOIN table b USING (id) -- 去除缺失值 ) TABLE random_pick LIMIT 1000; -- 实际限制</code>
PostgreSQL 9.5에는 TABLESAMPLE SYSTEM (n)
구문이 도입되었습니다. 여기서 n은 0에서 100 사이의 백분율입니다.
<code class="language-sql">SELECT * FROM big TABLESAMPLE SYSTEM ((1000 * 100) / 5100000.0);</code>
이 방법은 빠르지만 클러스터링 효과로 인해 진정한 무작위 샘플을 반환하지 못할 수도 있습니다.
테이블의 ID 열에 대한 결측값이 거의 없고 기본 키 인덱스가 있는 경우 방법 2(인덱스 기반 방법)가 최고의 속도와 성능을 제공하므로 최선의 선택입니다. 정확한 섹스.
결측값이 많은 테이블의 경우 결측값을 효과적으로 처리할 수 있는 방법 3(재귀적 CTE)을 고려해 보세요.
방법 1 (random()
및 limit
)은 성능이 낮으므로 작은 테이블에 사용해야 합니다.
방법 4(TABLESAMPLE SYSTEM
)는 빠르지만 다른 방법만큼 정확하지는 않습니다. 큰 테이블에서 빠른 추정을 하는 데 사용할 수 있습니다.
위 내용은 PostgreSQL에서 임의의 행을 효율적으로 선택하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!