sql >> Databáze >  >> RDS >> Sqlserver

Prům. nekonzistence plováku

To je velmi podobné:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Problém je v tom, že s nepřesným datovým typem (FLOAT/REAL ) pořadí aritmetických operací na záležitostech s pohyblivou řádovou čárkou. Demo z připojení:

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

Možná řešení:

  • CAST všechny argumenty na přesný datový typ jako DECIMAL/NUMERIC
  • změňte tabulku a změňte FLOAT na DECIMAL
  • můžete zkusit donutit optimalizátor dotazů, aby vypočítal součet ve stejném pořadí.

Dobrou zprávou je, že když pro vaši aplikaci záleží na stabilním výsledku dotazu, můžete vynutit, aby pořadí bylo stejné tím, že zabráníte paralelismu pomocí OPTION (MAXDOP 1) .

Vypadá to, že původní odkaz je mrtvý. Webový archiv




  1. Jak pg_dump RDS Postgres databázi?

  2. Spuštění balíčku SSIS pomocí dtexec

  3. Dynamická kontingenční tabulka MySQL

  4. Monitorování PostgreSQL v hybridním prostředí