La requête suivante effectue un fenêtrage SUM
sur une table columnstore avec 1500 total rows
, dont chacun a la valeur 0 ou 1, et il déborde le INT
type de données. Pourquoi cela arrive-t-il?
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.
Script complet
Voir ce fichier pour un script de reproduction entièrement contenu.
Plan de requête
Voici un plan de requête estimé annoté ( XML complet sur Coller le plan ).
Requêtes similaires qui s'exécutent avec succès
Si l'une des modifications suivantes est effectuée, l'erreur ne se produit pas:
- Utilisez l'indicateur de trace
8649
pour préférer un plan parallèle quel que soit le seuil de coût pour le parallélisme - Utiliser l'indicateur de trace
9453
pour désactiver le mode batch - Utilisez la
COUNT
fonction d'agrégation au lieu de laSUM
fonction - Supprimer le
WHERE x.rank = 1
prédicat
Par exemple, cette requête s'exécute avec succès:
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 */)
la source