Почему агрегат окна пакетного режима дает арифметическое переполнение?

11

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

Ответы:

6

Несколько комментаторов смогли воспроизвести эту проблему. Сначала мы думали, что SQL Server 2017 CU10 решил эту проблему, но потом обнаружили, что ошибка может быть воспроизведена во всех версиях SQL Server, которые мы пробовали, включая CU10. Однако некоторые комментаторы наблюдали случайный элемент, когда один и тот же сценарий не всегда вызывал ошибку.

Поскольку нет логического способа, которым вычисление суммы по набору неотрицательных чисел, чья максимально возможная сумма составляет 1500, может переполнить 32-разрядное целое число, мы считаем, что это ошибка в операторе агрегирования окна пакетного режима. Будучи новым оператором в SQL Server 2016, разумно предположить, что еще могут быть некоторые крайние случаи, которые нужно сгладить.

Вот отчет об ошибке, который мы подали в Microsoft.

Ответ был:

Это исправлено в SQL Server 2019 CTP 2.1, а также скоро будет исправлено в базе данных SQL Azure.

Джефф Паттерсон
источник