La query seguente esegue una finestra SUMsu una tabella columnstore con 1500 total rows, ognuno dei quali ha il valore 0 o 1 e trabocca il INTtipo 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
8649per preferire un piano parallelo indipendentemente dalla soglia di costo per il parallelismo - Utilizzare il flag di traccia
9453per disabilitare la modalità batch - Utilizzare la
COUNTfunzione di aggregazione anziché laSUMfunzione - Rimuovi il
WHERE x.rank = 1predicato
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 */)
