Poniższe zapytanie wykonuje SUM
okno nad tabelą magazynu kolumn 1500 total rows
, z których każda ma wartość 0 lub 1, i przepełnia INT
typ danych. Dlaczego to się dzieje?
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.
Pełny skrypt
Zobacz ten plik, aby uzyskać w pełni zawarty skrypt do odtwarzania.
Plan zapytań
Oto szacowany plan zapytań z adnotacjami ( pełny kod XML na temat Wklej plan ).
Podobne zapytania, które zostały wykonane pomyślnie
W przypadku wprowadzenia dowolnej z poniższych modyfikacji błąd nie występuje:
- Użyj flagi śledzenia,
8649
aby preferować plan równoległy, niezależnie od progu kosztów dla równoległości - Użyj flagi śledzenia,
9453
aby wyłączyć tryb wsadowy - Użyj
COUNT
funkcji agregacji zamiastSUM
funkcji - Usuń
WHERE x.rank = 1
predykat
Na przykład to zapytanie wykonuje się pomyślnie:
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 */)
źródło