将浮动存储为Ints,过早优化?

时间:2015-03-05 01:34:54

标签: postgresql database-design

我有一个包含real列的表,其中包含基于应用程序其他表中的值的每日统计信息:

CREATE TABLE stat_summaries (
    id integer NOT NULL,
    date date NOT NULL,
    a_avg real NOT NULL,
    a_stddev real NOT NULL,
    a_z_score real NOT NULL,
    b_avg real NOT NULL,
    b_stddev real NOT NULL,
    b_z_score real NOT NULL,
    -- Plus six more letters
);

对于所有情况,我正在处理X.XXXX.XX形式的数字。所有计算都可以接受±0.1的误差。

鉴于此,我的一部分认为将这18个字段存储为smallint是一个好主意,并记住以该比例执行所有进一步的查询和计算。然后我只需要担心在视图层重新调整最终值,无论如何我必须这样做(例如0.333333 - > 0.33,23.111111 - > 23%)。这里的性能优势是显而易见的,但我不确定它们在宏观方案中的重要性(我们每天都在谈论10K-30K记录):我将存储一半数据量和未来的任何计算应用程序中的序列化将涉及整数而不是浮点数。

我的另一部分认为我将来会以某种方式支付这个决定,因为它有点损害了代码的人体工程学,因为我需要跟踪哪些列映射到哪种数字格式({{ 1}}或X.XX)在整个开发过程中。

1 个答案:

答案 0 :(得分:0)

数据库的性能由I / O主导。简单计算是次要因素。在建模数据库时,您应该考虑数据集成而不是优化数据类型。

每天10~30K的记录,这意味着每年3M~10M的记录,从数据库的角度来看并不是很大。

将浮点数存储到整数中并不是一个好主意。我不确定扭曲数据可以带来多大的性能优势。

因此,我认为您的案例最合适的数据类型是Numeric(4,2)

而且,您可能希望对这两种情况进行基准测试,检查性能,可维护性和开发便利性的差异。如果您在使用Numeric时遇到严重的性能问题,那么您当时可以考虑smallint