LIMIT / OFFSET을 사용하여 쿼리를 실행하고 총 행 수도 가져옵니다.
페이지 매김을 위해 LIMIT
및 OFFSET
절을 사용하여 쿼리를 실행해야합니다 . 그러나 LIMIT
및 OFFSET
절 없이 해당 쿼리에 의해 반환되는 행 수도 필요합니다 .
나는 실행하고 싶다 :
SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?
과:
SELECT COUNT(*) FROM table WHERE /* whatever */
동시에. 이를 수행하는 방법, 특히 Postgres가이를 최적화하여 두 가지를 개별적으로 실행하는 것보다 빠르도록하는 방법이 있습니까?
예. 간단한 창 기능으로 :
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE /* whatever */
ORDER BY col1
LIMIT ?
OFFSET ?
비용은 총 수를 사용하지 않는 것보다 상당히 높지만 두 개의 개별 쿼리보다 여전히 저렴합니다. Postgres는 두 경우 모두 실제로 모든 행 을 계산해야 하므로 적격 행의 총 수에 따라 비용이 부과됩니다. 세부:
그러나 , 다니가 지적했듯이 , 때 OFFSET
기본 쿼리에서 반환되는 행의 수, 행이 반환되지 않습니다 위대한로 적어도이다. 따라서 우리는 또한 full_count
.
허용되지 않는 경우 항상 전체 개수를 반환 하는 가능한 해결 방법 은 CTE 및 다음을 사용하는 것입니다 OUTER JOIN
.
WITH cte AS (
SELECT *
FROM tbl
WHERE /* whatever */
)
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 (중복)에 포함하는 데 비용이들 수 있습니다 .
returend 결과의 총 행 수를 얻기 위해 Just에 대해 동일한 쿼리를 두 번 호출하는 것은 좋지 않습니다. 실행 시간이 걸리고 서버 리소스가 낭비됩니다.
더 좋은 점 SQL_CALC_FOUND_ROWS
은 쿼리에서 MySQL에 쿼리 결과 제한과 함께 총 행 수를 가져 오도록 지시하는 것입니다.
다음과 같이 설정된 예 :
SELECT SQL_CALC_FOUND_ROWS employeeName, phoneNumber FROM employee WHERE employeeName LIKE 'a%' LIMIT 10;
SELECT FOUND_ROWS();
위의 쿼리 SQL_CALC_FOUND_ROWS
에서 나머지 필수 쿼리 에 옵션을 추가 하고 두 번째 줄을 실행합니다. 즉 SELECT FOUND_ROWS()
, 해당 문에서 반환 한 결과 집합의 행 수를 반환합니다.
아니.
There's perhaps some small gain you could theoretically gain over running them individually with enough complicated machinery under the hood. But, if you want to know how many rows match a condition you'll have to count them rather than just a LIMITed subset.
ReferenceURL : https://stackoverflow.com/questions/28888375/run-a-query-with-a-limit-offset-and-also-get-the-total-number-of-rows
'IT이야기' 카테고리의 다른 글
Array.isArray와 instanceof Array 사용의 차이점 (0) | 2021.04.24 |
---|---|
AngularJS 오류 : $ injector : unpr 알 수없는 공급자 (0) | 2021.04.24 |
도커 ENV VS RUN 내보내기 (0) | 2021.04.23 |
Android Studio 2 베타 5의 빌드 변형에서 테스트 아티팩트 선택기가 누락 / 사라짐 (0) | 2021.04.23 |
fetch()는 헤더를 보내는가 (0) | 2021.04.23 |