A consulta a seguir executa uma janela SUM
sobre uma tabela columnstore com 1500 total rows
, cada qual com o valor 0 ou 1, e excede 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.
Script completo
Consulte este arquivo para obter um script de reprodução completo.
Plano de consulta
Aqui está um plano de consulta estimado anotado ( XML completo em Colar o plano ).
Consultas semelhantes que são executadas com sucesso
Se alguma das seguintes modificações for feita, o erro não ocorrerá:
- Use 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 */)
fonte