Perché l'aggregazione della finestra in modalità batch produce un overflow aritmetico?


11

La query seguente esegue una finestra SUMsu una tabella columnstore con 1500 total rows, ognuno dei quali ha il valore 0 o 1 e trabocca il INTtipo di dati. Perché sta succedendo?

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.

Sceneggiatura completa

Vedi questo file per uno script di riproduzione completamente contenuto.

Piano di query

Ecco un piano di query stimato con annotazioni ( XML completo su Incolla il piano ).

inserisci qui la descrizione dell'immagine

Query simili eseguite correttamente

Se viene apportata una delle seguenti modifiche, l'errore non si verifica:

  • Utilizzare il flag di traccia 8649per preferire un piano parallelo indipendentemente dalla soglia di costo per il parallelismo
  • Utilizzare il flag di traccia 9453per disabilitare la modalità batch
  • Utilizzare la COUNTfunzione di aggregazione anziché la SUMfunzione
  • Rimuovi il WHERE x.rank = 1predicato

Ad esempio, questa query viene eseguita correttamente:

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

Risposte:


6

Più commentatori sono stati in grado di riprodurre questo problema. Inizialmente pensavamo che SQL Server 2017 CU10 avesse risolto il problema, ma poi abbiamo scoperto che l'errore può essere riprodotto in tutte le versioni di SQL Server che abbiamo provato, incluso CU10. Tuttavia, alcuni commentatori hanno osservato un elemento del caso in cui lo stesso script non ha sempre innescato l'errore.

Poiché non esiste alcun modo logico che calcolare una somma attraverso un insieme di numeri non negativi la cui somma massima possibile è 1.500 possa traboccare un numero intero a 32 bit, riteniamo che si tratti di un bug nell'operatore di aggregazione della finestra in modalità batch. Essendo un nuovo operatore in SQL Server 2016, è ragionevole supporre che potrebbero esserci ancora alcuni casi limite da risolvere.

Ecco la segnalazione di bug che abbiamo archiviato con Microsoft.

La risposta è stata:

Questo problema è stato risolto nel CTP 2.1 di SQL Server 2019 e presto verrà risolto anche nel database SQL di Azure.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.