前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PG:INT4 VS. FLOAT4 VS. NUMERIC

PG:INT4 VS. FLOAT4 VS. NUMERIC

作者头像
yzsDBA
发布2021-02-03 12:04:43
1.3K0
发布2021-02-03 12:04:43
举报
文章被收录于专栏:PostgreSQL研究与原理解析

PG:INT4 VS. FLOAT4 VS. NUMERIC

关系型数据库中数据类型是一个重要话题。PG提供很多不同类型,但并不是所有类型都相同。根据需要实现的目标,可能应用需要不同列类型。本文主要关注三种重要的数据类型:整型、浮点型、数字型。最近,我们看到了一些与这个话题相关的案例,我认为应该与公众分享这些知识,以确保读者避免最近在客户端应用程序中遇到的一些坑。

创建表并初始化数据

开始前,首先创建一个表并初始化10亿条数据,数据类型如下所示:

代码语言:javascript
复制
test=# CREATE TABLE t_demo (a int, b float, c numeric);
CREATE TABLE
test=# INSERT INTO t_demo
SELECT random()*1000000, random()*1000000, random()*1000000
FROM generate_series(1, 10000000) AS id;
INSERT 0 10000000

test=# VACUUM ANALYZE;
VACUUM
test=# \timing
Timing is on.

导入数据后,设置好优化器统计信息和hint位,以确保公平比较。

FLOAT VS. Numeric

虽然整型数据类型用处非常清楚但是numeric和float4/foat8之间有一个重要区别。在内部,float使用CPU的浮点单元。这有几个含义:float遵循IEEE754标准,意味着遵循标准定义的舍入规则。孙然这对于许多数据集来说正确,但是不适合处理金钱。

对于货币,需要不同的舍入规则,这就是为什么必须使用numeric数据类型来处理财务数据。案例:

代码语言:javascript
复制
test=# SELECT a,
b,
c,
a + b,
a + b = c
FROM (SELECT 0.1::float8 a,
0.2::float8 b,
0.3::float8 c
) AS t;
a    | b   | c   | ?column?            | ?column?
-----+-----+-----+---------------------+----------
0.1  | 0.2 | 0.3 | 0.30000000000000004 | f
(1 row)

如是,浮点数类型总是使用近似值。在多数情况下很好,但是税收人员一点不喜欢近似值,这就是为什么浮点数完全不合适。

性能问题

然而,数字类型比浮点数有优点吗?当然有。看一个简单的对比:

代码语言:javascript
复制
test=# SELECT avg(a) FROM t_demo;
avg
---------------------
499977.020028900000
(1 row)

Time: 255.179 ms

整数类型很快,执行时间大约255毫秒,对于float4也是如此:

代码语言:javascript
复制
test=# SELECT avg(b) FROM t_demo;
avg
-------------------
499983.2076499941
(1 row)
3
Time: 267.371 ms

然而numeric类型有一点不同,他有更多开销,如下:

代码语言:javascript
复制
test=# SELECT avg(c) FROM t_demo;
avg
-------------------------
500114.1490108727200733
(1 row)

Time: 368.749 ms

查询慢很多,因为内部FPU没参与numeric的实现,所有操作都是在CPU上使用整数运算模拟的。当然这就需要更多时间。

最后

如果想了解更多性能问题,查阅https://www.cybertec-postgresql.com/en/hot-updates-in-postgresql-for-better-performance/。

原文

https://www.cybertec-postgresql.com/en/postgresql-int4-vs-float4-vs-numeric/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PG:INT4 VS. FLOAT4 VS. NUMERIC
    • 创建表并初始化数据
      • FLOAT VS. Numeric
        • 性能问题
          • 最后
            • 原文
            相关产品与服务
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档