La query seguente esegue una finestra SUM
su una tabella columnstore con 1500 total rows
, ognuno dei quali ha il valore 0 o 1 e trabocca il INT
tipo di dati. Perché sta succedendo?
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.
Sceneggiatura completa
Vedi questo file per uno script di riproduzione completamente contenuto.
Piano di query
Ecco un piano di query stimato con annotazioni ( XML completo su Incolla il piano ).
Query simili eseguite correttamente
Se viene apportata una delle seguenti modifiche, l'errore non si verifica:
- Utilizzare il flag di traccia
8649
per preferire un piano parallelo indipendentemente dalla soglia di costo per il parallelismo - Utilizzare il flag di traccia
9453
per disabilitare la modalità batch - Utilizzare la
COUNT
funzione di aggregazione anziché laSUM
funzione - Rimuovi il
WHERE x.rank = 1
predicato
Ad esempio, questa query viene eseguita correttamente:
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 */)