以下查询在具有SUM
的列存储表上执行带窗口的窗口1500 total rows
,每个表的值均为0或1,并且溢出INT
数据类型。为什么会这样呢?
SELECT a, p, s, v, m, n,
SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
SELECT a, p, s, v, m, n,
RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
FROM #t /* A columnstore table with 1,500 rows */
) x
WHERE x.rank = 1
--Msg 8115, Level 16, State 2, Line 1521
--Arithmetic overflow error converting expression to data type int.
完整脚本
查询计划
这是一个带注释的估算查询计划(“粘贴计划”中的完整XML)。
成功执行的类似查询
如果进行以下任何修改,则不会发生错误:
8649
不管并行性的成本阈值如何,都可以使用跟踪标志来选择并行计划- 使用跟踪标志
9453
禁用批处理模式 - 使用
COUNT
聚合函数代替SUM
函数 - 除掉
WHERE x.rank = 1
谓词
例如,此查询成功执行:
SELECT a, p, s, v, m, n,
SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
SELECT a, p, s, v, m, n,
RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
FROM #t /* A columnstore table with 1,500 rows */
) x
WHERE x.rank = 1
OPTION (QUERYTRACEON 9453/* Disable batch mode */)