我有一个查询,它通过恰好是其中一个表的主键的列连接两个表。我也是GROUP BY
同一列。现在我需要使用主键从表中返回一些列。在MySQL中我可以将它们添加到select语句中而不用担心,但在SQL Server中我必须将它们添加到GROUP BY
或者包含在聚合函数中(如MAX
)。逻辑上两者都是冗余的,因为主键确保我想要获取的列在整个组中具有相同的值。问题是哪种解决方案更好(使用聚合函数或将它们放在GROUP BY
中)?
我测试了两种变体,它们似乎具有相同的查询成本。执行计划几乎相同,但具有聚合函数(MAX
)的变体似乎稍快。但是,使用聚合函数会对使用的类型设置一些限制,并迫使我不必要地转换某些列的类型(我正在查看您bit
列)。注意,我确实需要结果来匹配某些类型。
P.S。我还可以将实际需要分组的列移动到子查询中并将其放在FROM
部分中以避免在不需要它的列上使用聚合函数或GROUP BY
。然而,我的直觉告诉我它不会让它更快(要测试它)。
然而,我再次证明,在SQL方面,没有任何答案总是正确的。我的答案是不使用这两种方案中的任何一种。我的直觉是错误的,并且将需要分组的表\列放到子查询中,而不是将它们与其余部分连接起来(执行时间甚至更短)。但是在另一个查询中,这种解决方案可能会使事情变得更糟。
因此,我没有找到冗余GROUP BY
与冗余聚合的答案,而是发现它实际上是冗余的GROUP BY
与冗余聚合与具有非冗余GROUP BY
的子查询