예. 간단한 창 기능 :
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE
ORDER BY col1
OFFSET ?
LIMIT ?
비용은 총 수를 사용하지 않는 것보다 상당히 높지만 일반적으로 두 개의 개별 쿼리보다 저렴합니다. Postgres는 실제로 모든 행을 계산해야 하므로 적격 행의 총 수에 따라 비용이 부과됩니다. 세부:
그러나 , 다니가 지적했듯이 , 때 OFFSET
기본 쿼리에서 반환되는 행의 수, 행이 반환되지 않습니다 위대한로 적어도이다. 그래서 우리는 또한 full_count
.
허용되지 않는 경우 항상 전체 개수를 반환 하는 가능한 해결 방법 은 CTE 및 다음을 사용하는 것입니다 OUTER JOIN
.
WITH cte AS (
SELECT *
FROM tbl
WHERE
)
SELECT *
FROM (
TABLE cte
ORDER BY col1
LIMIT ?
OFFSET ?
) sub
RIGHT JOIN (SELECT count(*) FROM cte) c(full_count) ON true;
너무 큰 full_count
경우 추가 된 NULL 값의 한 행을 얻 OFFSET
습니다. 그렇지 않으면 첫 번째 쿼리에서와 같이 모든 행에 추가됩니다.
모든 NULL 값이있는 행이 유효한 결과 일 offset >= full_count
경우 빈 행의 출처를 명확히 하기 위해 확인 해야합니다.
이것은 여전히 기본 쿼리를 한 번만 실행합니다. 그러나 쿼리에 더 많은 오버 헤드를 추가하고 카운트에 대해 기본 쿼리를 반복하는 것보다 적은 경우에만 비용을 지불합니다.
최종 정렬 순서를 지원하는 인덱스를 사용할 수 ORDER BY
있는 경우 CTE (중복)에 포함하는 데 비용이들 수 있습니다 .