따라서 일반적인 질문은 GROUP BY 절에서 필드 집계 또는 추가 표현식을 사용하는 것이 더 빠릅니다. 다음은 두 가지 쿼리입니다.PSQL 그룹 대 집계 속도
검색어 1 (GROUP BY에서 추가 표현) : (임의을 사용
SELECT sum(subquery.what_i_want)
FROM (
SELECT table_1.some_id,
(
CASE WHEN some_date_field IS NOT NULL
THEN
FLOOR(((some_date_field - current_date)::numeric/7) + 1) * MAX(some_other_integer)
ELSE
some_integer * MAX(some_other_integer)
END
) what_i_want
FROM table_1
JOIN table_2 on table_1.some_id = table_2.id
WHERE ((some_date_field IS NOT NULL AND some_date_field > current_date) OR some_integer > 0) -- per the data and what i want, one of these will always be true
GROUP BY some_id_1, some_date_field, some_integer
) subquery
쿼리 2 (문제의 테이블 2 필드의 각 레코드는 여기에이 데이터 세트에서 (같은 값을 가지고 있기 때문에)) 집합 함수) :
SELECT sum(subquery.what_i_want)
FROM (
SELECT table_1.some_id,
(
CASE WHEN MAX(some_date_field) IS NOT NULL
THEN
FLOOR(((MAX(some_date_field) - current_date)::numeric/7) + 1) * MAX(some_other_integer)
ELSE
MAX(some_integer) * MAX(some_other_integer)
END
) what_i_want
FROM table_1
JOIN table_2 on table_1.some_id = table_2.id
WHERE ((some_date_field IS NOT NULL AND some_date_field > current_date) OR some_integer > 0) -- per the data and what i want, one of these will always be true
GROUP BY some_id_1
) subquery
psql은 훌륭한 벤치마킹 도구를 제공하지 않습니다. \timing on
하나의 쿼리에 대해서만 시간이 필요하므로 의미있는 결과를 얻기에 충분한 시도가있는 벤치 마크를 실행하는 것이 가장 지루합니다.
레코드의 경우, 약 n = 50에서 수행 했으므로 평균적으로 더 빠르게 실행되는 집계 방법 (쿼리 2)을 보았지만 p 값은 ~ .13이므로 매우 결론적이지 않았습니다.
'그걸 가지고 있니?