如何更正此SQL查询并对其进行优化?
我正在运行这个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
DISTINCT k.Column_1,
是错误的和错误的语法。 distinct
关键字适用于您正在提取的整组属性,而不是每列。
应该
SELECT DISTINCT k.Column_2, k.Column_1, s.Column_3, s.k.Column_4, s.Column_5, ....
请注意,您可以在一列上使用不同的聚合函数:''SELECT ColumnA,COUNT(DISTINCT ColumnB)FROM Table GROUP BY ColumnA''。统计不同的列B,而不是所有的列B。 – justiceorjustus
谢谢Rahul。我试图重新安排它,它永远在运行。任何帮助优化脚本? – Kary
@LivingstoneKaramage,为表单结构发布一个单独的问题,所有表的索引信息以及生成的查询计划 – Rahul
一件大事考虑到的是,连接可以返回更多的组合,那么你可能期望。例如,拿这两张表。
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
之间的值的每一个可能的组合为了避免运行到这个问题,通过加入更多字段,使得您的联接更具限制性,即使您最终不会最终使用它们。
这几乎不是你真正想要做的。我建议以减少的联接数量和输入数据和期望的结果为例提出另一个问题。 –
独特总是一个昂贵的操作,table_1有多大?您可以使用派生表更快地完成此操作。另外s.k.column_4没有意义。哪个表是column_4? – HLGEM
请描述一些数据的含义在这里。它在如何呈现查询方面有所不同。既然你不能区分只有一列,你想达到什么目的?在数据前后给我们提供你想要达到的目标。 – HLGEM