2014-06-08 2 views
1

따라서 일반적인 질문은 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이므로 매우 결론적이지 않았습니다.

'그걸 가지고 있니?

답변

0

일반적인 대답은 - + 동일해야합니다. 필드에 함수를 사용하거나 사용하지 않을 때 함수 기반 인덱스를 히트/누락 할 수 있지만 집계 함수가 아니고 where 절에서 열리스트에 더 많이 사용됩니다. 그러나 이것은 추측에만 해당됩니다.

해야 할 내용 use for analyzing executionEXPLAIN ANALYZE입니다. 계획에서 스캔 유형뿐만 아니라 반복 횟수, 비용 및 개별 작업 시간도 확인할 수 있습니다. 물론 함께 사용하실 수 있습니다 psql