【发布时间】:2020-01-29 19:49:24
【问题描述】:
我团队的一个(对 SQL 相对较新)成员正在编写一个碰巧使用窗口函数的 SQL 查询。在审查后,我注意到他们的窗口功能是这样构建的:
COUNT(*) OVER(PARTITION BY Part1+Part2) AS A
我立即做了反馈,说应该是这样的:
COUNT(*) OVER(PARTITION BY Part1, Part2) AS A
Part1 和 Part2 都是 nvarchars。
然后我停下来反思,我实际上无法弄清楚为什么那会是错误的。据我所见,这实际上会产生相同的结果(确实如此)。除了在第一个查询的初始表扫描之后额外的计算标量步骤之外,实际执行计划几乎相同(这是查询成本的 0%)。 I/O 统计数据显示,第一个版本的逻辑读取次数减少了 5 次(12,665 到 12,670)。
那么除了编码约定之外,使用这两种形式是否有任何好处/坏处?在这种情况下这是否可以正常工作,但在某些情况下可能会产生不一致的结果?
【问题讨论】:
-
如果零件是 (3,5)、(4,4) 和 (2,6) 怎么办?还是
('2','12')和('21','2')?此外,服务器必须在对数据进行分区之前提前计算所有连接,这对索引或外部查询的排序顺序没有任何好处
标签: sql sql-server tsql count window-functions