Следующий запрос выполняет оконное SUM
отображение над таблицей columnstore 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 */)
источник