これは、次のように非常に似ています。 SELECT SUM(...) is non-deterministic when adding the column-values of datatype float
。
問題は、データ型が不正確なことです(FLOAT/REAL
)浮動小数点の算術演算の順序が重要です。接続からのデモ:
DECLARE @fl FLOAT = 100000000000000000000
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
SET @fl = @fl + CONVERT(float, 5000)
SET @i = @i + 1
END
SET @fl = @fl - 100000000000000000000
SELECT CONVERT(NVARCHAR(40), @fl, 2)
-- 0.000000000000000e+000
DECLARE @fl FLOAT = 0
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
SET @fl = @fl + CONVERT(float, 5000)
SET @i = @i + 1
END
SET @fl = @fl + 100000000000000000000
SET @fl = @fl - 100000000000000000000
SELECT @fl
-- 507904
LiveDemo
考えられる解決策:
-
CAST
DECIMAL/NUMERIC
などの正確なデータ型に対するすべての引数 - テーブルを変更し、
FLOAT
を変更しますDECIMAL
へ - クエリオプティマイザに同じ順序で合計を計算させるように試みることができます。
幸いなことに、安定したクエリ結果がアプリケーションにとって重要な場合は、 OPTION(MAXDOP 1)を使用して並列処理を防止することで、順序を同じにすることができます。 。
最初のリンクが切れているようです。 WebArchive