La requête suivante effectue un fenêtrage SUMsur une table columnstore avec 1500 total rows, dont chacun a la valeur 0 ou 1, et il déborde le INTtype 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
8649pour préférer un plan parallèle quel que soit le seuil de coût pour le parallélisme - Utiliser l'indicateur de trace
9453pour désactiver le mode batch - Utilisez la
COUNTfonction d'agrégation au lieu de laSUMfonction - Supprimer le
WHERE x.rank = 1pré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 */)
