次のクエリは、SUM
列ストアテーブルに対してウィンドウ処理を実行します1500 total rows
。それぞれの値は0または1であり、INT
データ型をオーバーフローします。なんでこんなことが起こっているの?
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.
完全なスクリプト
完全に含まれている再現スクリプトについては、このファイルを参照してください。
クエリプラン
これは、注釈付きの推定クエリプランです(Paste the Planの完全なXML)。
正常に実行される同様のクエリ
次のいずれかの変更が行われた場合、エラーは発生しません。
8649
並列処理のコストしきい値に関係なく、トレースフラグを使用して並列プランを優先する- トレースフラグ
9453
を使用してバッチモードを無効にする - 使用
COUNT
するのではなく、集計関数をSUM
機能 WHERE x.rank = 1
述語を削除する
たとえば、次のクエリは正常に実行されます。
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 */)