将浮点数存储为整数,这是一种过早的优化吗?
Storing Floats as Ints, a Premature Optimization?
我有一个 table 和 real
列,其中包含基于我们应用程序的其他 table 中的值的每日统计信息:
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.XX
或 XX.XX
形式的数字。 ±0.1 的误差是所有计算的acceptable。
鉴于此,我的一部分认为将这 18 个字段存储为 smallint
是个好主意,并记住以该规模执行所有进一步的查询和计算。然后我只需要担心在视图层重新调整最终值,无论如何我已经必须这样做(例如 0.333333 -> 0.33、23.111111 -> 23%)。这里的性能优势是显而易见的,但我不确定它们在总体方案中有多重要(我们谈论的是每天 10K-30K 条记录):我将存储一半的数据量和任何未来的计算应用程序中的序列化将涉及整数而不是浮点数。
我的另一部分认为我将来会以某种方式为这个决定付出代价,因为它在某种程度上损害了代码的人体工程学,因为我需要跟踪哪些列映射到哪种数字格式 ( X.XX
或 XX.XX
) 在整个开发过程中。
数据库的性能由I/O支配。简单的计算是次要因素。在对数据库建模时,您应该考虑数据集成而不是优化数据类型。
每天10~30K条记录,也就是每年3M~10M条记录,从数据库的角度来看并不是很大。
将浮点数存储为整数不是一个好主意。我不确定通过扭曲数据可以获得多少性能优势。
所以,我认为最适合您的数据类型是 Numeric(4,2)
。
而且,也许你想对这两种情况进行基准测试,检查性能、可维护性和开发便利性方面的差异。如果你在使用Numeric
时遇到严重的性能问题,那你可以考虑smallint
。
我有一个 table 和 real
列,其中包含基于我们应用程序的其他 table 中的值的每日统计信息:
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.XX
或 XX.XX
形式的数字。 ±0.1 的误差是所有计算的acceptable。
鉴于此,我的一部分认为将这 18 个字段存储为 smallint
是个好主意,并记住以该规模执行所有进一步的查询和计算。然后我只需要担心在视图层重新调整最终值,无论如何我已经必须这样做(例如 0.333333 -> 0.33、23.111111 -> 23%)。这里的性能优势是显而易见的,但我不确定它们在总体方案中有多重要(我们谈论的是每天 10K-30K 条记录):我将存储一半的数据量和任何未来的计算应用程序中的序列化将涉及整数而不是浮点数。
我的另一部分认为我将来会以某种方式为这个决定付出代价,因为它在某种程度上损害了代码的人体工程学,因为我需要跟踪哪些列映射到哪种数字格式 ( X.XX
或 XX.XX
) 在整个开发过程中。
数据库的性能由I/O支配。简单的计算是次要因素。在对数据库建模时,您应该考虑数据集成而不是优化数据类型。
每天10~30K条记录,也就是每年3M~10M条记录,从数据库的角度来看并不是很大。
将浮点数存储为整数不是一个好主意。我不确定通过扭曲数据可以获得多少性能优势。
所以,我认为最适合您的数据类型是 Numeric(4,2)
。
而且,也许你想对这两种情况进行基准测试,检查性能、可维护性和开发便利性方面的差异。如果你在使用Numeric
时遇到严重的性能问题,那你可以考虑smallint
。