Чому агрегат вікон пакетного режиму переповнює арифметичні показники?


11

Наступний запит виконує вікно 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 */) 

Відповіді:


6

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

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

Ось звіт про помилки, який ми подали до Microsoft.

Відповідь була такою:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.