与PARTITION BY和GROUPBY截然不同
技术问答
519 人阅读
|
0 人回复
|
2023-09-14
|
我在正在检查的应用程序中找到了一些SQL查询如下:
_7 Y4 ]. J( X9 h: l6 mSELECT DISTINCTCompany,Warehouse,Item,SUM(quantity) OVER (PARTITION BY Company,Warehouse,Item) AS stock我确定会产生与以下结果相同的结果:
/ u$ e7 z) T$ T( A: ~) z& e! X# |, _SELECTCompany,Warehouse,Item,SUM(quantity) AS stockGROUP BY Company,Warehouse,Item与第一种方法相比,使用第一种方法是否有任何好处(性能、可读性、额外的灵活性、可维护性等)?
4 e3 I9 B% o* k4 X$ ] " y1 J9 g, N# m
解决方案:
/ o9 d3 d0 m. }2 a4 x5 g1 v8 { 表现:优胜者:GROUP BY
' Z: z* f# _8 s- D! E& i* X一些非常基本的测试显示,至少在我看来,这两个查询生成了完全不同的查询计划。PARTITION BY速度明显较慢。
/ G8 n; [1 L% M该GROUP BY查询计划只包括表扫描和聚集操作,PARTITION BY该计划有两个嵌套循环自连接。PARTITIONBY第二次运行约2800ms,则GROUP BY只用了500毫秒。
* x1 ^) I# h+ B; `. ~2 L9 }& t8 d可读性/可维护性:优胜者:GROUP BY& O) _7 {& e/ W' ~6 j d
根据评论员的意见,PARTITION BY对大多数开发人员来说,它的可读性很差,所以将来可能很难维护。, j7 h3 }8 z6 D. e. H- G; x
灵活性优胜者:PARTITION BY- g G w- c0 O0 P& Y
PARTITION BY使您在选择分组列时更加灵活。GROUP BY,所有聚合列只能有一组组列。DISTINCT PARTITION BY你可以在每个分区有不同的列。同样,在某些领域DBMS上,你可以从OVER选择句子中更多的聚合/分析功能。 |
|
|
|
|
|