Die folgende Abfrage führt ein Fenster SUMüber eine Spaltenspeichertabelle mit aus 1500 total rows, von denen jede den Wert 0 oder 1 hat, und überläuft den INTDatentyp. Warum passiert dies?
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.
Vollständiges Skript
In dieser Datei finden Sie ein vollständig enthaltenes Reproduktionsskript.
Abfrageplan
Hier ist ein kommentierter geschätzter Abfrageplan ( vollständiges XML beim Einfügen des Plans ).
Ähnliche Abfragen, die erfolgreich ausgeführt werden
Wenn eine der folgenden Änderungen vorgenommen wird, tritt der Fehler nicht auf:
- Verwenden Sie das Ablaufverfolgungsflag,
8649um einen parallelen Plan unabhängig von der Kostenschwelle für Parallelität zu bevorzugen - Verwenden Sie das Trace-Flag
9453, um den Stapelmodus zu deaktivieren - Verwenden Sie die
COUNTAggregationsfunktion anstelle derSUMFunktion - Entfernen Sie das
WHERE x.rank = 1Prädikat
Diese Abfrage wird beispielsweise erfolgreich ausgeführt:
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 */)
