2016-06-28 143 views
2

我有一個查詢使用聚合函數將maximum absolute的值分配給表中的另一列。問題是需要很長時間(約10-15秒)來查詢完成時間。這是查詢的樣子:聚合到'普通'查詢

UPDATE calculated_table c 
    SET tp = (SELECT MAX(ABS(s.tp)) 
       FROM ts s INNER JOIN tc t ON s.id = t.id 
       GROUP BY s.id); 

其中id不是唯一的,因此是分組。 tp是一個數字整數字段。下面是表的樣子:

TABLE ts 
     PID(primary)  |   id (FKEY)    |      tp (integer)     
--------------------+-----------------------------+------------------------------------------------------ 
1      | 2        | -100 
2      | 2        | -500 
3      | 2        | -1000 

TABLE tc 
     PID(primary)  |   id (FKEY)        
--------------------+-----------------------------+------------------------- 
1      | 2        

我希望輸出的樣子:

TABLE c 
     PID(primary)  |   tp (integer)     
--------------------+-----------------------------+-------- 
1      | 1000         

我試圖使它像這樣的工作:

UPDATE calculated_table c 
    SET tp = (SELECT s.tp 
       FROM ts s INNER JOIN tc t ON s.id = t.id 
       ORDER BY s.tp DESC 
       LIMIT 1); 

雖然提高了性能,但結果是不正確的..任何幫助將不勝感激?

+0

可以TP是一個正的值Δα –

+0

你有沒有適當的ID ID和TC ID? – scaisEdge

+0

@MaheshMadushanka是..我有ID的 – faizanjehangir

回答

2

我還是設法修改查詢創建一個多列索引,turnsout嵌套aggregate functions是不是一個好的選擇。但是,如果它可以幫助任何人,這裏是我落得這樣做:

UPDATE calculated_table c 
    SET tp = (SELECT ABS(s.trade_position) 
       FROM ts s INNER JOIN tc t ON s.id = t.id 
       WHERE c.id = s.id 
       ORDER BY ABS(s.tp) DESC 
       LIMIT 1); 
0

嘗試:

UPDATE calculated_table c 
    SET tp = (SELECT greatest(MAX(s.tp) , - MIN(s.tp)) 
       FROM ts s INNER JOIN tc t ON s.id = t.id 
       WHERE c.id = s.id 
      ); 

也嘗試在ts(id, tp)

0

我希望下面的SQL將會對您有所幫助,我在Netezza公司進行測試,而不是PostgreSQL的。另外,我沒有把它更新。

SELECT ABS(COM.TP) FROM TC C向左OUTER JOIN
(SELECT ID,TP FROM TS甲 WHERE NOT EXISTS(SELECT 1 FROM TS乙 WHERE A.ID = B.ID 和ABS(B.TP)> ABS(A.TP)))COM ON C.ID = COM.ID

1

雖然它提高了性能,但結果卻不正確。

手術很成功,但病人死亡。

與您的查詢的問題是,

SELECT MAX(ABS(s.tp)) 
    FROM ts s INNER JOIN tc t ON s.id = t.id 
    GROUP BY s.id); 

不會產生一個標值;它會生成一個值爲的列,每個值爲s.id。你的DBMS真的應該引發一個語法錯誤。就性能而言,我認爲您將按順序將子查詢生成的每行應用於目標表中的每一行。這可能既緩慢又錯誤。

您想要的是將您的select輸出與您正在更新的表相關聯,並將行更新爲相關的行。下面是從另一個表更新一個表的ANSI語法:

UPDATE calculated_table 
SET tp = (SELECT MAX(ABS(s.tp)) 
      FROM ts s INNER JOIN tc t ON s.id = t.id 
      where s.id = calculated_table.id) 
where exists (select 1 from ts join tc 
       on ts.id = tc.id 
       where ts.id = calculated_table.id) 

這應該接近你想要的。

順便說一句,它很容易從字面上理解相關的子查詢,認爲子查詢是運行N次,對於目標表中的每一行。這是正確的方式來描繪它,邏輯。 DBMS不會以這種方式實現,但很可能,性能應該比圖片所顯示的要好得多。