2017-08-10 58 views
0

我遇到查詢問題,下面在PostgreSQL中運行 但是永不結束。你有什麼建議嗎?關於永不結束的PostgreSQL查詢

WITH tmp1 AS (
    SELECT istante, produzione, 
     CAST (CAST (produzione AS FLOAT)/12000 AS NUMERIC(6,2)) AS proden, 
     CAST (CAST (consumo AS FLOAT)/12000 AS NUMERIC(6,2)) AS consen 
    FROM ftv1 
), tmp2 AS (
    SELECT LEAST(proden, consen) AS aconsen 
    FROM tmp1 
) 
SELECT tmp1.istante, tmp1.proden, tmp1.consen, 
     (tmp1.consen - tmp2.aconsen) AS enconsen 
FROM tmp1, tmp2;    
+0

你的表有多少行,你在等待多久?*永不結束*? – yanman1234

+1

選擇FROM tmp1,tmp2語句作爲笛卡爾連接。因爲它沒有完成。請給出正確的連接條件 –

+1

沒有任何定義「ftv1」和「tmp2」的連接條件的WHERE子句,所以實際上它是一個交叉連接,它將第一個表中的所有行與第二個表中的所有行進行組合。如果第一個表包含例如10.000行,第二個表包含20.000行,那麼交叉連接產生10000 x 20000 = 200000000行 - 它需要一些時間(可能需要十幾天,甚至幾個星期,但最有可能直到磁盤空間耗盡,因爲RDBMS將所有生成的行保存在臨時表中的磁盤上)。 – krokodilko

回答

0

嘗試類似下面

WITH tmp1 AS (
    SELECT istante, produzione, 
     CAST (CAST (produzione AS FLOAT)/12000 AS NUMERIC(6,2)) AS proden, 
     CAST (CAST (consumo AS FLOAT)/12000 AS NUMERIC(6,2)) AS consen 
    FROM ftv1 
), tmp2 AS (
    SELECT istante,LEAST(proden, consen) AS aconsen 
    FROM tmp1 
) 
SELECT t1.istante, t1.proden, t1.consen, 
     (t1.consen - t2.aconsen) AS enconsen 
FROM tmp1 t1 
join tmp2 t2 
on t1.istante = t2.istante; 
+0

感謝您的回答,您的查詢在大約8分鐘內完成(在一個小小的Debian虛擬機中)。我剛剛發佈的發佈大約需要3-4分鐘。 –

0

看到你的答案我用下面的代碼解決之前,反正現在我知道爲什麼這個工程,沒有笛卡爾乘積。謝謝大家的幫助。

WITH tmp1 AS (
    SELECT istante, produzione, 
     (CAST (produzione AS FLOAT)/12000) AS proden, 
     (CAST (consumo AS FLOAT)/12000) AS consen 
    FROM ftv1 
), tmp2 AS (
    SELECT istante, produzione, proden, consen, 
     LEAST(proden, consen) AS aconsen 
    FROM tmp1 
) 
SELECT istante, proden, consen, aconsen, 
     (consen - aconsen) AS enconsen, 
     GREATEST(proden - consen, 0) as senten 
FROM tmp2;