2013-06-24 29 views
1

我有一個長查詢和explain analyze沒有幫助。Postgreslq解釋分析:隱藏時間

的PostgreSQL的版本:9.1

目前的計劃:

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

查詢:

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和Hashaggregate相隔。 Hashjoin需要1200到1600ms。隨着HashAggregate它跳轉到5645ms。

任何遇到過這個問題的人都可以解釋這個問題嗎?

+1

我清理了你的文章並計劃了一下,但是如果你按照你想要的方式重新設置和重新格式化它,這將對你的實際模式,查詢以及你試圖實現的內容有所幫助。事實上,這有點難以遵循。 –

+0

這只是*查詢計劃的一部分* - 您已將其中的部分內容截斷。請顯示完整的計劃。對於像這樣的大計劃,請將計劃過濾到http://explain.depesz.com/並提供一個鏈接幷包含正文副本。這對檢查大計劃非常有幫助。另外:** PostgreSQL版本和確切的查詢文本請**。當您編輯您的問題以糾正這些問題時,請在此處評論,以便Denis和我獲悉有關更改。 –

+0

我使用您的網站,thanx的提示。我已經添加了查詢,但部分產生了,所以我很難修改。 – Sid

回答

1

張貼的計劃似乎不符合您的描述。例如,在給定的計劃中沒有「實際時間」5645ms,可能是複製和粘貼時缺少頂層節點。

但是無論如何,1600到5645之間的時間應該是從HashAggregate讀取它需要讀取的最後一行開始,但還不能生成第一行的時間。例如,因爲它需要對它讀取的數據執行一些批量操作。

+0

我添加了更好的查詢計劃和查詢等信息。我確實忘了兩條最重要的線:)。查詢計劃中兩個節點之間的數據庫做什麼樣的操作? – Sid