【问题标题】:How can i correct this SQL query & optimize it?如何更正此 SQL 查询并对其进行优化?
【发布时间】:2017-06-28 21:09:13
【问题描述】:

我正在运行这个 SQL 查询,它给了我一个错误,当我重新排列列并让 DISTINCT k.Column_1 先出现时,它可以工作,但之后会永远运行,而且看起来很昂贵。我该如何纠正、优化等?

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 总是一个昂贵的操作,table_1 有多大?您可能可以使用派生表更快地完成此操作。 s.k.column_4 也没有意义。 column_4 在哪个表中?
  • 请描述一下这里的数据是什么意思。它在如何呈现查询方面有所不同。既然你不能只区分一列,你想达到什么目的?向我们提供数据之前和之后的数据,以显示您想要实现的目标。
  • ASlo 你有什么索引?

标签: sql database analytics business-intelligence database-administration


【解决方案1】:

DISTINCT k.Column_1, 不正确且语法错误。 distinct 关键字适用于您正在获取的整组属性,而不是每列。

应该是

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

【讨论】:

  • 请注意,您可以在具有聚合函数的一列上使用 distinct:SELECT ColumnA, COUNT(DISTINCT ColumnB) FROM Table GROUP BY ColumnA。计算不同的 B 列,而不是所有 B 列。
  • 谢谢拉胡尔。我试图重新安排它,它一直在运行。对优化脚本有帮助吗?
  • @LivingstoneKaramage,针对表结构、所有表的索引信息以及生成的查询计划发布一个单独的问题
【解决方案2】:

要考虑的一件大事是,连接可以返回比您预期的更多的组合。以这两张表为例。

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 之间所有可能的值组合

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

为避免遇到此问题,请通过加入更多字段来使您的联接更具限制性,即使您最终不会使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2016-02-27
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多