列出或连接SQL窗口函数

Cob*_*rch 4 sql t-sql sql-server window-functions

我团队的一位(相对于SQL而言较新)成员正在编写一个碰巧使用窗口函数的SQL查询。在查看后,我注意到他们的窗口函数结构如下:

COUNT(*) OVER(PARTITION BY Part1+Part2) AS A
Run Code Online (Sandbox Code Playgroud)

我立即做出了反馈说明,说应该像这样:

COUNT(*) OVER(PARTITION BY Part1, Part2) AS A
Run Code Online (Sandbox Code Playgroud)

Part1和Part2都是nvarchars。

然后我停下来思考,我实际上无法弄清为什么那是错误的。据我所知,实际上会产生相同的结果(确实如此)。除了在第一个查询上进行初始表扫描之后,执行额外的Compute Scalar步骤外,实际执行计划几乎相同(这是查询成本的0%)。I / O统计数据表明,第一个版本的逻辑读取次数减少了5次(从12665到12670)。

那么,除了编码约定外,使用任何一种形式都没有好处/不利之处吗?在这种情况下是否可以正常工作,但在某些情况下可能会产生不一致的结果?

GMB*_*GMB 5

这两个表达式都是有效的,但它们不会做相同的事情。

考虑以下数据:

Part1    Part2
AB       C
A        BC
Run Code Online (Sandbox Code Playgroud)

当用PARTITION BY Part1+Part2两个记录连接字符串时PARTITION BY Part1, Part2,它们属于同一分区,而使用时,它们将属于不同的分区。

因此,问题实际上归结为:您的用例的正确分区标准是什么?通常,除非您正在做一些花哨的事情,否则您会想要PARTITION BY Part1, Part2。但这实际上必须根据您的实际用例从功能的角度进行回答。

  • 我怀疑第一个表达式还会导致性能下降,因为服务器必须在分区之前计算所有值 (2认同)
  • 此外,如果 Part1 或 Part2 为“NULL”,则连接结果将为“NULL”,这可能是也可能不是预期结果 (2认同)