Postgres中的定点数字类型?

时间:2016-03-02 21:10:00

标签: postgresql fixed-point

我管理的Postgres数据库包含许多包含0到100之间数字的列,其中包含固定(通常不超过3个,通常为2个)的小数位数。这些数字中的大多数都围绕它们各自的平均值聚集,因此重复很多,如果正确实施,可以使它们成为GIN和GIST索引的理想类型。这与我们未来的开发计划非常吻合,因为需要GIN和/或GIST来索引我们计划在未来实施的某些类型的查询。 ranges附带的功能也很有用,如果将它们存储为整数,也可以使用。

目前,它们被存储为浮点数,但是在尝试按照其确切值查找数字时,这在过去引起了问题。我知道Postgres中的NUMERIC类,但就性能而言,这似乎与我想要的完全相反。我们几乎不会在Postgres中使用这些数字进行任何数学运算,对于我们所做的任何数学运算,它将是非常基础的,精度并不重要。因此,这些列似乎是定点数类型的理想候选者。基本上,我想让它们在内部存储为整数,但是当在查询中返回并且通过UPDATE和INSERT设置时,它应该移动小数点,比如说,向左移动三个位置。

从我的阅读到目前为止,我认为我有两个选择。我可以在这些列上创建触发器来操作内部为整数类型的值的输入和输出,或者我可以在C中创建自定义标量类型。第二个选项似乎是更好的,但我认为如果它很容易做到,那么现在有人已经做过了。或许还有一个更好的解决方案,我还没有遇到过?我倾向于创建自定义数据类型,但我仍然不确定是否有充分理由不这样做。

哦,几乎所有关于这些数据类型的查询都是它们是否落在给定范围内。可能是一些加法和减法,但很少有乘法或除法,可能永远不会比这更先进。代码只运行一个生产服务器,可能是一个测试服务器,以及4-5个开发机器。我不确定其中有多少相关,但我希望有人能让我走上正轨。

1 个答案:

答案 0 :(得分:2)

假设您不想“乘以​​100”路线,假设您知道一些“C”,定义您自己的简单数据类型并不算太糟糕。当然,您需要为数据的可移植性和持续维护付出代价,但这对您来说可能是值得的。检查有关数组,范围和索引的含义 - 可能有更多的代码要写入。

http://pgxn.org/tag/type/

基于32/64位存储,有两个定点十进制实现。第一个是由Pavel Stehule撰写的,他是着名的PostgreSQL社区成员。我没有使用过或者看过代码,但它应该是测试的一个很好的起点。