不同数据类型的计算效率?

时间:2013-05-02 19:33:50

标签: sql performance sql-server-2005 optimization types

我有一个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))

提前致谢。

1 个答案:

答案 0 :(得分:0)

根据经验,与双数或小数相比,双倍计算速度更快。任意精度的数学都很昂贵。现代计算机上的浮点数学相对便宜。 (我是唯一一个记得购买浮点处理器来加速电子表格计算的人吗?)

但这是一条经验法则。如果你的数字或十进制类型中有很多行,很多列和相对几位数,那么可能会发现磁盘I / O是瓶颈。 (PostgreSQL在数字数据类型中支持高达1000位的精度。我称之为许多数字。)

你能为公司做的最好的事情就是

  • 构建一个与生产表结构相同的测试表,
  • 加载足够的随机数据行,使其不适合RAM。

然后运行并计算一组查询以测试性能。

使用与生产相同的测试表,因为有很多列以不同的列运行磁盘子系统。使用 lot 随机数据,因为您想尝试近似麻烦表的行为。 (使用窄表进行测试,就像你在测试代码中所做的那样,不会给系统带来足够的压力。)

如果此表具有财务重要性,则可能值得阅读dbms的CREATE TABLE语句文档。您几乎肯定会找到几个可以显着影响性能的选项。 Oracle的CREATE TABLE语句文档大约需要50页才能在纸上打印。 (50,不是拼写错误。)