>데이터 베이스 >MySQL 튜토리얼 >PostgreSQL에서 임의의 행을 효율적으로 선택하려면 어떻게 해야 합니까?

PostgreSQL에서 임의의 행을 효율적으로 선택하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-21 05:41:08475검색

How can I efficiently select random rows in PostgreSQL?

PostgreSQL의 효율적인 무작위 행 선택 방법

PostgreSQL은 임의의 행을 효율적으로 선택하기 위한 다양한 방법을 제공합니다.

방법 1: Random() 및 Limit 절 사용

이 방법은 random() 함수와 LIMIT 절을 사용합니다.

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

그러나 큰 테이블의 경우 이 방법은 전체 테이블 스캔이 필요하므로 속도가 느려질 수 있습니다.

방법 2: 인덱스 기반 방법

이 방법은 기본 키 인덱스를 사용하여 쿼리를 최적화합니다.

<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>

이 방법은 전체 테이블 스캔 대신 인덱스 스캔을 사용하기 때문에 첫 번째 방법보다 빠릅니다.

방법 3: 재귀적 CTE 사용

이 방법은 재귀 공통 테이블 표현식(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>

방법 4: TABLESAMPLE SYSTEM(n) 사용

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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