Наступний запит виконує вікно SUM
над таблицею стовпців стовпців 1500 total rows
, кожен з яких має значення 0 або 1, і він переповнює INT
тип даних. Чому це відбувається?
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.
Повний сценарій
Дивіться у цьому файлі повний сценарій відтворення.
План запитів
Ось анотований кошторисний план запитів ( повний XML на вставці плану ).
Подібні запити, які успішно виконуються
Якщо зроблено будь-яку з наведених нижче змін, помилка не виникає:
- Використовуйте прапор трассі,
8649
щоб віддати перевагу паралельному плану незалежно від порогу витрат на паралелізм - Використовуйте прапор трассирування,
9453
щоб вимкнути пакетний режим - Використовуйте функцію
COUNT
агрегації замістьSUM
функції - Видаліть
WHERE x.rank = 1
присудок
Наприклад, цей запит успішно виконується:
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 */)