回答

收藏

与PARTITION BY和GROUPBY截然不同

技术问答 技术问答 380 人阅读 | 0 人回复 | 2023-09-14

我在正在检查的应用程序中找到了一些SQL查询如下:6 H  h' K; P5 j$ @# p
SELECT DISTINCTCompany,Warehouse,Item,SUM(quantity) OVER (PARTITION BY Company,Warehouse,Item) AS stock我确定会产生与以下结果相同的结果:
4 l' k$ [- T  ^3 [SELECTCompany,Warehouse,Item,SUM(quantity) AS stockGROUP BY Company,Warehouse,Item与第一种方法相比,使用第一种方法是否有任何好处(性能、可读性、额外的灵活性、可维护性等)?
9 W/ }3 @1 p1 y+ }  ~0 \                                                               
2 k3 a1 R- |; B: \( v, F    解决方案:                                                                / G2 M' n+ Z5 R0 q% w/ b+ E# s
                                                                表现:优胜者:GROUP BY
6 {/ E+ x  K, z2 M+ Y. z8 S一些非常基本的测试显示,至少在我看来,这两个查询生成了完全不同的查询计划。PARTITION BY速度明显较慢。3 a7 @$ D. E2 l  g$ U
该GROUP BY查询计划只包括表扫描和聚集操作,PARTITION BY该计划有两个嵌套循环自连接。PARTITIONBY第二次运行约2800ms,则GROUP BY只用了500毫秒。
; T: ?% c3 I. F4 E' z2 G可读性/可维护性:优胜者:GROUP BY7 k- p7 I# Y: U$ r. c. u. G
根据评论员的意见,PARTITION BY对大多数开发人员来说,它的可读性很差,所以将来可能很难维护。
6 i3 F+ ]( d, r* m# t, n+ f灵活性优胜者:PARTITION BY
$ \: I. g5 G2 n4 L& yPARTITION BY使您在选择分组列时更加灵活。GROUP BY,所有聚合列只能有一组组列。DISTINCT  PARTITION BY你可以在每个分区有不同的列。同样,在某些领域DBMS上,你可以从OVER选择句子中更多的聚合/分析功能。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则