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 INT
Datentyp. 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,
8649
um 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
COUNT
Aggregationsfunktion anstelle derSUM
Funktion - Entfernen Sie das
WHERE x.rank = 1
Prä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 */)