0

我正在運行這個SQL查詢,它給了我一個錯誤,當我重新安排列和使DISTINCT k.Column_1先來它的工作,但然後永遠運行,似乎是一個昂貴的。我怎樣才能糾正這一點,優化等?如何更正此SQL查詢並對其進行優化?

SELECT 
k.Column_2, DISTINCT k.Column_1, s.Column_3, s.Column_4, s.Column_5, s.Column_6, s.Column_7, 
s.Column_8, s.Column_9, s.Column_10, s.Column_11, t.Column_5, 
t.Column_6, t.Column_7, t.Column_8, t.Column_9, t.Column_10, 
t.Column_11, r.Column_3, 
p.Column_2, p.Column_3, p.Column_4, p.5, p.Column_6, p.Column_7, p.Column_8, p.Column_9 
FROM table_1 k 
LEFT JOIN table_2 s 
ON k.Column_1 = s.Column_1 
LEFT JOIN table_3 t 
ON k.Column_1 = t.Column_1 
LEFT table_4 r 
ON k.Column_1 = r.Column_1 
LEFT JOIN table_5 p 
ON k.Column_1 = p.Column_1 

我現在運行這個編輯SQL查詢,它是運行下去,我想如果可能的話進行優化。

Column_1是索引。

SELECT DISTINCT k.Column_1, k.MONTH, 
SUM(s.Column_3) Column_3, 
SUM(s.Column_4) Column_4, 
SUM(s.Column_5) Column_5, 
SUM(s.Column_6) Column_6, 
SUM(s.Column_7) Column_7, 
SUM(s.Column_8) Column_8, 
SUM(s.Column_9) Column_9, 
SUM(s.Column_10) Column_10, 
SUM(s.Column_11) Column_11, 
SUM(t.Column_5) Column_5, 
SUM(t.Column_6) Column_6, 
SUM(t.Column_7) t.Column_7, 
SUM(t.Column_8) Column_8, 
SUM(t.Column_9) Column_9, 
SUM(t.Column_10) Column_10, 
SUM(t.Column_11) Column_11, 
SUM(r.Column_3) Column_3, 
SUM(p.Column_2) Column_2, 
SUM(p.Column_3) Column_3, 
SUM(p.Column_4) Column_4, 
SUM(p.Column_5) Column_5, 
SUM(p.Column_6) Column_6, 
SUM(p.Column_7) Column_7, 
SUM(p.Column_8) Column_8, 
SUM(p.Column_9) Column_9 
FROM table_1 k 
LEFT JOIN table_2 s 
ON k.Column_1 = s.Column_1 
LEFT JOIN table_3 t 
ON k.Column_1 = t.Column_1 
LEFT table_4 r 
ON k.Column_1 = r.Column_1 
LEFT JOIN table_5 p 
ON k.Column_1 = p.Column_1 
GROUP BY k.Column_1, k.MONTH 
+2

這幾乎不是你真正想要做的。我建議以減少的聯接數量和輸入數據和期望的結果爲例提出另一個問題。 –

+0

獨特總是一個昂貴的操作,table_1有多大?您可以使用派生表更快地完成此操作。另外s.k.column_4沒有意義。哪個表是column_4? – HLGEM

+0

請描述一些數據的含義在這裏。它在如何呈現查詢方面有所不同。既然你不能區分只有一列,你想達到什麼目的?在數據前後給我們提供你想要達到的目標。 – HLGEM

回答

2

DISTINCT k.Column_1,是錯誤的和錯誤的語法。 distinct關鍵字適用於您正在提取的整組屬性,而不是每列。

應該

SELECT DISTINCT k.Column_2, k.Column_1, s.Column_3, s.k.Column_4, s.Column_5, .... 
+0

請注意,您可以在一列上使用不同的聚合函數:''SELECT ColumnA,COUNT(DISTINCT ColumnB)FROM Table GROUP BY ColumnA''。統計不同的列B,而不是所有的列B。 – justiceorjustus

+0

謝謝Rahul。我試圖重新安排它,它永遠在運行。任何幫助優化腳本? – Kary

+2

@LivingstoneKaramage,爲表單結構發佈一個單獨的問題,所有表的索引信息以及生成的查詢計劃 – Rahul

0

一件大事考慮到的是,連接可以返回更多的組合,那麼你可能期望。例如,拿這兩張表。

Table_A Table_B 
+-----+ +-----+ 
|Var_A| |Var_B| 
+-----+ +-----+ 
| 2 | | 2 | 
| 2 | | 2 | 
| 2 | | 4 | 
| 4 | +-----+ 
+-----+ 

如果運行

SELECT 
    * 
FROM table_a 
LEFT JOIN table_b 
ON table_a.var_a = table_b.var_b 

你會得到這個爛攤子,因爲它

+-----+-----+ 
|Var_A|Var_B| 
+-----+-----+ 
| 2 | 2 | 
| 2 | 2 | 
| 2 | 2 | 
| 2 | 2 | 
| 2 | 2 | 
| 2 | 2 | 
| 4 | 4 | 
+-----+-----+ 

匹配var_a和var_b

之間的值的每一個可能的組合爲了避免運行到這個問題,通過加入更多字段,使得您的聯接更具限制性,即使您最終不會最終使用它們。