以下查询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 */)