La siguiente consulta realiza una ventana SUM
sobre una tabla de almacén de columnas 1500 total rows
, cada una de las cuales tiene el valor 0 o 1, y desborda el INT
tipo de datos. ¿Por qué está pasando esto?
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.
Guión completo
Consulte este archivo para ver un script de reproducción totalmente contenido.
Plan de consulta
Aquí hay un plan de consulta estimado anotado ( XML completo en Pegar el plan ).
Consultas similares que se ejecutan con éxito
Si se realiza alguna de las siguientes modificaciones, no se produce el error:
- Use la marca de seguimiento
8649
para preferir un plan paralelo independientemente del umbral de costo para el paralelismo - Use la marca de seguimiento
9453
para deshabilitar el modo por lotes - Use la
COUNT
función de agregación en lugar de laSUM
función - Eliminar el
WHERE x.rank = 1
predicado
Por ejemplo, esta consulta se ejecuta con éxito:
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 */)