DISTINCT与PARTITION BY对GROUPBY

And*_*ris 8 sql sql-server group-by distinct query-performance

我在我正在检查的应用程序中找到了一些SQL查询:

SELECT DISTINCT
Company, Warehouse, Item,
SUM(quantity) OVER (PARTITION BY Company, Warehouse, Item) AS stock
Run Code Online (Sandbox Code Playgroud)

我很确定这会得到与以下结果相同的结果:

SELECT
Company, Warehouse, Item,
SUM(quantity) AS stock
GROUP BY Company, Warehouse, Item
Run Code Online (Sandbox Code Playgroud)

在第一种方法中使用第一种方法是否有任何好处(性能,可读性,编写查询的额外灵活性,可维护性等)?

And*_*ris 12

性能:

优胜者: GROUP BY

对带有未编制索引的列的大型表进行的一些非常基本的测试表明,至少在我的情况下,这两个查询生成了完全不同的查询计划.那一个PARTITION BY明显慢了.

GROUP BY查询计划只包括一个表扫描和聚集操作,而PARTITION BY计划有两个嵌套的循环自联接.在PARTITION BY第二运行了约2800ms,则GROUP BY只有500毫秒了.

可读性/可维护性:

优胜者: GROUP BY

根据评论者的意见,PARTITION BY大多数开发人员的可读性较低,因此将来可能也难以维护.

灵活性

优胜者: PARTITION BY

PARTITION BY为您提供更多选择分组列的灵活性.随着GROUP BY你只能有一组分组对所有聚合列列.有了DISTINCT + PARTITION BY你可以在每个分区不同的列.此外,在某些DBMS上,您可以从OVER子句中的更多聚合/分析函数中进行选择.