Tại sao cửa sổ chế độ hàng loạt tổng hợp mang lại tràn số học?


11

Truy vấn sau đây thực hiện một cửa sổ SUMtrên bảng cột 1500 total rows, mỗi bảng có giá trị 0 hoặc 1 và nó tràn ra INTkiểu dữ liệu. Tại sao chuyện này đang xảy ra?

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.

Kịch bản đầy đủ

Xem tập tin này cho một kịch bản sao chép đầy đủ.

Kế hoạch truy vấn

Đây là một kế hoạch truy vấn ước tính có chú thích ( XML đầy đủ khi Dán Kế hoạch ).

nhập mô tả hình ảnh ở đây

Các truy vấn tương tự thực hiện thành công

Nếu bất kỳ sửa đổi nào sau đây được thực hiện, lỗi không xảy ra:

  • Sử dụng cờ theo dõi 8649để thích một kế hoạch song song bất kể ngưỡng chi phí cho song song
  • Sử dụng cờ theo dõi 9453để tắt chế độ hàng loạt
  • Sử dụng COUNThàm tổng hợp thay cho SUMhàm
  • Xóa WHERE x.rank = 1vị ngữ

Ví dụ: truy vấn này thực hiện thành công:

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 */) 

Câu trả lời:


6

Nhiều người bình luận đã có thể tái tạo vấn đề này. Ban đầu, chúng tôi nghĩ rằng SQL Server 2017 CU10 đã giải quyết vấn đề, nhưng sau đó thấy rằng lỗi có thể được sao chép trong tất cả các phiên bản SQL Server mà chúng tôi đã thử, bao gồm cả CU10. Tuy nhiên, một số người bình luận quan sát thấy một yếu tố cơ hội trong đó cùng một kịch bản không phải lúc nào cũng gây ra lỗi.

Do không có cách logic nào khi tính toán một tổng trên một tập hợp các số không âm có tổng tối đa có thể là 1.500 có thể vượt quá số nguyên 32 bit, chúng tôi tin rằng đây là một lỗi trong toán tử tổng hợp cửa sổ chế độ hàng loạt. Là một nhà điều hành mới trong SQL Server 2016, thật hợp lý khi cho rằng vẫn có thể có một số trường hợp cạnh để giải quyết.

Đây là báo cáo lỗi chúng tôi đã nộp với Microsoft.

Câu trả lời là:

Điều này đã được sửa trong SQL Server 2019 CTP 2.1 và cũng sẽ sớm được sửa trong Cơ sở dữ liệu SQL Azure.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.