A consulta a seguir executa uma janela SUM
em uma tabela columnstore com 1500 total rows
, cada uma com o valor 0 ou 1, e transborda o INT
tipo de dados. Por que isso está acontecendo?
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.
Roteiro completo
Veja este arquivo para um script de reprodução totalmente contido.
Plano de consulta
Aqui está um plano de consulta estimado anotado ( XML completo em Colar o Plano ).
Consultas semelhantes executadas com sucesso
Se alguma das seguintes modificações for feita, o erro não ocorrerá:
- Use o sinalizador de rastreamento
8649
para preferir um plano paralelo, independentemente do limite de custo para paralelismo - Use o sinalizador de rastreamento
9453
para desativar o modo em lote - Use a
COUNT
função de agregação em vez daSUM
função - Remova o
WHERE x.rank = 1
predicado
Por exemplo, esta consulta é executada com sucesso:
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 */)