2017-08-10 61 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;