0

高精度の浮動小数点数/10 進数の列を含む 12 億行のデータ セットがあります。要件は、小数点以下約 12 桁までの精度があることです。完全に等しいかどうかを比較する必要はなく、奇妙な数値アーティファクト (7 が 7.000000000000001 として出力されるなど) を防ぐ必要もありません。

したがって、このプロジェクトでは、FLOAT または DECIMAL(18,15) のいずれかを使用できます...または、理由があれば DECIMAL(15,12) を使用することもできます。このデータで行う必要がある計算には、ABS()、AVG()、加算、減算、乗算、および除算が含まれます。おそらく他の統計関数も。

このタスクに最も効率的なデータ型オプションはどれですか?

編集:これは、これに答えるために使用しようとしているテストコードです。しかし、算術オーバーフロー エラーが発生し続けます。データ型を変更してテストを台無しにせずに回避する方法がわかりません。このテストを無効にするデータ型を導入することなく、私がキャストできるものを見た人はいますか? コードは次のとおりです。

IF OBJECT_ID('tempdb..#TempFloat') IS NOT NULL DROP TABLE #TempFloat
IF OBJECT_ID('tempdb..#TempDecimal') IS NOT NULL DROP TABLE #TempDecimal
IF OBJECT_ID('tempdb..#TempBinary') IS NOT NULL DROP TABLE #TempBinary

SELECT CAST(RAND() AS FLOAT) AS RandA, CAST(0 AS FLOAT) AS CalcA INTO #TempFloat 
SELECT CAST(RAND() AS DECIMAL(18,15)) AS RandA, CAST(0 AS DECIMAL(18,15)) AS CalcA INTO #TempDecimal
SELECT CAST(RAND() AS BINARY(8)) AS RandA, CAST(0 AS BINARY(8)) AS CalcA INTO #TempBinary

INSERT INTO #TempFloat
(
    RandA,
    CalcA
)
(
SELECT 
    CAST(RAND() AS FLOAT) AS RandA, 
    CAST(0 AS FLOAT) AS CalcA
)

INSERT INTO #TempDecimal
(
    RandA,
    CalcA
)
(
SELECT 
    CAST(RAND() AS FLOAT) AS RandA, 
    CAST(0 AS FLOAT) AS CalcA
)

INSERT INTO #TempBinary
(
    RandA,
    CalcA
)
(
SELECT 
    CAST(RAND() AS FLOAT) AS RandA, 
    CAST(0 AS FLOAT) AS CalcA
)
GO  -- 9999

UPDATE #TempFloat
SET CalcA = (ABS((RandA/2) - 1) * 10000) + (RandA - (RandA * 2))

UPDATE #TempDecimal
SET CalcA = (ABS((RandA/2) - 1) * 10000) + (RandA - (RandA * 2))

UPDATE #TempBinary
SET CalcA = (ABS((RandA/2) - 1) * 10000) + (RandA - (RandA * 2))

前もって感謝します。

4

1 に答える 1