Toplu mod penceresi toplamı neden aritmetik taşma sağlar?


11

Aşağıdaki sorgu , her biri 0 veya 1 değerine SUMsahip bir sütun deposu tablosu üzerinde pencereli gerçekleştirir 1500 total rowsve INTveri türünü taşar . Bu neden oluyor?

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.

Komut dosyasının tamamı

Tamamen içerilen bir çoğaltma komut dosyası için bu dosyaya bakın.

Sorgu planı

İşte açıklamalı bir tahmini sorgu planı ( Planı Yapıştır ile ilgili tam XML ).

resim açıklamasını buraya girin

Başarılı bir şekilde yürütülen benzer sorgular

Aşağıdaki değişikliklerden herhangi biri yapılırsa hata oluşmaz:

  • 8649Paralellik maliyet eşiğinden bağımsız olarak paralel bir plan tercih etmek için izleme işaretini kullanın
  • 9453Toplu modunu devre dışı bırakmak için izleme işaretini kullanma
  • Kullanım COUNTyerine toplama işlevini SUMfonksiyonu
  • WHERE x.rank = 1Yüklemi kaldır

Örneğin, bu sorgu başarıyla yürütülür:

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

Yanıtlar:


6

Birden fazla yorumcu bu sorunu yeniden oluşturabilmiştir. Başlangıçta SQL Server 2017 CU10'un sorunu çözdüğünü düşündük, ancak hatanın CU10 da dahil olmak üzere denediğimiz tüm SQL Server sürümlerinde çoğaltılabileceğini bulduk. Bununla birlikte, bazı yorumcular aynı komut dosyasının her zaman hatayı tetiklemediği bir şans öğesi gözlemledi.

Mümkün olan maksimum toplamı 1.500 olan negatif olmayan bir sayı kümesinde bir toplam hesaplamanın 32 bit tamsayıyı aşmasının mantıklı bir yolu olmadığından, bunun toplu mod pencere toplama işlecinde bir hata olduğuna inanıyoruz. SQL Server 2016'da yeni bir operatör olarak, hala ütülemek için bazı uç durumlar olabileceğini varsaymak mantıklıdır.

İşte Microsoft'a sunduğumuz hata raporu.

Yanıt şuydu:

Bu, SQL Server 2019 CTP 2.1'de düzeltilmiştir ve yakında Azure SQL Veritabanı'nda da düzeltilecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.