1

나는 긴 쿼리를 사용했으며 explain analyze은 도움이되지 않습니다. 의 PostgreSQLPostgreslq 설명 분석 : 숨김 시간

버전 : 9.1

현재 계획 :

http://explain.depesz.com/s/sWG

쿼리 : 몇 초는 HashJoin와 Hashaggregate 사이에 경과처럼

SELECT temps_mois.rfoperyea  AS c0, 
     dwhinv.dwhinv___rfovsnide AS c1, 
     rfoadv_1.rfoadvsup  AS c2, 
     rfoadv_2.rfoadvsup  AS c3, 
     rsaaev_3.rsaaevsup  AS c4, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'LABO' 
        AND dwhinv.dwhinv___rfoindide = '17' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m0, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'LABO' 
        AND dwhinv.dwhinv___rfoindide = '18' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m1, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'LABO' 
        AND dwhinv.dwhinv___rfoindide = '15' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m2, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'LABO' 
        AND dwhinv.dwhinv___rfoindide = '16' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m3, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '20' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m4, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '17' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m5, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '18' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m6, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '15' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m7, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '19' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m8, 
     Sum((CASE 
       WHEN dwhinv.dwhinv___rfodomide = 'ANAPATH' 
        AND dwhinv.dwhinv___rfoindide = '16' THEN dwhinv.dwhinvqte 
       ELSE 0 
      END))    AS m9 
FROM rfoper_temps_mois AS temps_mois, 
     dwhinv AS dwhinv, 
     rfoadv AS rfoadv_1, 
     rfoadv AS rfoadv_2, 
     rsaaev AS rsaaev_3 
WHERE (temps_mois.rfoper___rforefide = 'REF') 
     AND (dwhinv.dwhinv___rforefide = 'REF' 
      AND ((dwhinv.dwhinv___rfodomide = 'LABO' 
        AND dwhinv.dwhinv___rfoindide = '17') 
        OR (dwhinv.dwhinv___rfodomide = 'LABO' 
         AND dwhinv.dwhinv___rfoindide = '18') 
        OR (dwhinv.dwhinv___rfodomide = 'LABO' 
         AND dwhinv.dwhinv___rfoindide = '15') 
        OR (dwhinv.dwhinv___rfodomide = 'LABO' 
         AND dwhinv.dwhinv___rfoindide = '16') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '20') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '17') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '18') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '15') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '19') 
        OR (dwhinv.dwhinv___rfodomide = 'ANAPATH' 
         AND dwhinv.dwhinv___rfoindide = '16'))) 
     AND dwhinv.dwhinvdtd = temps_mois.rfoperdtd 
     AND temps_mois.rfoperyea IN ('2011', '2012') 
     AND dwhinv.dwhinv___rfovsnide = 'version' 
     AND (rfoadv_1.rfoadv___rfovdeide = 'STRC' 
      AND rfoadv_1.rfoadvrvs = 1 
      AND rfoadv_1.rfoadv___rforefide = 'REF') 
     AND dwhinv.dwhinv_d2rfodstide = rfoadv_1.rfoadvinf 
     AND rfoadv_1.rfoadvsup = 'REF' 
     AND (rfoadv_2.rfoadv___rfovdeide = 'STRC_REF' 
      AND rfoadv_2.rfoadvrvs = 1 
      AND rfoadv_2.rfoadv___rforefide = 'REF') 
     AND dwhinv.dwhinv_p2rfodstide = rfoadv_2.rfoadvinf 
     AND rfoadv_2.rfoadvsup IN ('01', '04', '05', '06', 
            '07', '99', 'REF', 'CR2107', 
            'CR2108', 'CR2109', 'CR2110', 'CR2111', 
            'CR2114', 'CR2116', 'CR2126', 'CR4101', 
            'CR4201') 
     AND (rsaaev_3.rsaaev___rsavedide = 'PRESTA_ACTE' 
      AND rsaaev_3.rsaaevrvs = 1 
      AND rsaaev_3.rsaaev___rforefide = 'REF') 
     AND dwhinv.dwhinv___rsaedtide = rsaaev_3.rsaaevinf 
     AND rsaaev_3.rsaaevsup IN ('PRISE_EN_CHARGE', 'REG_EXT', 
            'REG_HOSPI_SEANCE') 
GROUP BY temps_mois.rfoperyea, 
      dwhinv.dwhinv___rfovsnide, 
      rfoadv_1.rfoadvsup, 
      rfoadv_2.rfoadvsup, 
      rsaaev_3.rsaaevsup 

보인다. Hashjoin은 1200-1600ms가 소요됩니다. HashAggregate를 사용하면 5645ms로 이동합니다.

이 문제를 만난 다른 사람이 차이점을 설명 할 수 있을까요?

+1

게시물을 정리하고 약간 계획을 세웠지 만, 실제 스키마, 쿼리 및 달성하려는 내용과 함께 원하는대로 다시 표현하고 다시 형식을 지정하면 도움이됩니다. 상황이 그렇듯이 따라하기가 어렵습니다. –

+0

이것은 쿼리 계획 *의 일부일뿐입니다. 당신은 그 부분을 잘라 냈습니다. 전체 계획을 보여주십시오. 이와 같은 큰 계획의 경우 http://explain.depesz.com/에 계획을 지나서 텍스트 사본을 포함하여 링크를 제공하십시오. 큰 계획을 검토하는 데 매우 도움이됩니다. 또한 : ** PostgreSQL 버전 및 정확한 쿼리 텍스트 **를 참조하십시오. Denis와 내가 변경 사항을 통지받을 수 있도록 문제를 수정 한 경우 여기에 의견을 남기십시오. –

+0

나는 팁을 사용하여 thanx를 사용합니다. 쿼리를 추가했지만 부분적으로 생성되어 수정할 필요가 없습니다. – Sid

답변

1

게시 된 계획이 귀하의 설명과 일치하지 않는 것 같습니다. 예를 들어 주어진 계획에 5645ms의 "실제 시간"이 없으며 복사 및 붙여 넣기에서 맨 위 노드가 누락되었을 수 있습니다.

그러나 어쨌든 1600에서 5645 사이의 시간은 HashAggregate가 읽어야하는 마지막 행을 읽었을 때부터 아직 첫 행을 생성 할 수없는 시간입니다. 예를 들어, 읽은 데이터에 대해 일괄 작업을 수행해야하기 때문입니다.

+0

더 나은 쿼리 계획 및 쿼리와 같은 정보를 추가했습니다. 나는 정말로 가장 중요한 두 줄을 잊었다. 쿼리 계획에서 두 노드간에 데이터베이스가 수행하는 작업은 어떤 종류입니까? – Sid