Mengapa jendela mode kumpulan mengumpulkan hasil melimpah aritmatika?

11

Kueri berikut melakukan windowed di SUMatas tabelstore dengan 1500 total rows, masing-masing memiliki nilai 0 atau 1, dan melimpahi INTtipe data. Mengapa ini terjadi?

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.

Skrip lengkap

Lihat file ini untuk skrip reproduksi yang lengkap.

Rencana kueri

Berikut adalah perkiraan rencana kueri beranotasi ( XML lengkap tentang Tempel Paket ).

masukkan deskripsi gambar di sini

Kueri serupa yang berhasil dieksekusi

Jika salah satu dari modifikasi berikut dilakukan, kesalahan tidak terjadi:

  • Gunakan tanda jejak 8649untuk memilih rencana paralel terlepas dari ambang biaya untuk paralelisme
  • Gunakan tanda jejak 9453untuk menonaktifkan mode batch
  • Gunakan COUNTfungsi agregasi alih-alih SUMfungsi
  • Hapus WHERE x.rank = 1predikat

Misalnya, kueri ini dijalankan dengan sukses:

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 */) 
Geoff Patterson
sumber

Jawaban:

6

Beberapa komentator telah dapat mereproduksi masalah ini. Kami awalnya berpikir bahwa SQL Server 2017 CU10 menyelesaikan masalah, tetapi kemudian menemukan bahwa kesalahan dapat direproduksi di semua versi SQL Server yang kami coba, termasuk CU10. Namun, beberapa komentator mengamati unsur peluang di mana skrip yang sama tidak selalu memicu kesalahan.

Karena tidak ada cara logis untuk menghitung jumlah di seluruh rangkaian angka non-negatif yang jumlah maksimumnya adalah 1.500 dapat melimpahi integer 32 bit, kami percaya ini adalah bug dalam operator agregat jendela mode batch. Menjadi operator baru di SQL Server 2016, masuk akal untuk mengasumsikan bahwa mungkin masih ada beberapa kasus tepi untuk diperbaiki.

Ini adalah laporan bug yang kami ajukan ke Microsoft.

Responsnya adalah:

Ini diperbaiki di SQL Server 2019 CTP 2.1 dan juga akan segera diperbaiki di Azure SQL Database.

Geoff Patterson
sumber