PG:INT4 VS. FLOAT4 VS. NUMERIC

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PG:INT4 VS. FLOAT4 VS. NUMERIC

PG:INT4 VS. FLOAT4 VS. NUMERIC


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


创建表并初始化数据


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



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数据类型来处理财务数据。案例:

    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)


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


    性能问题


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

      test=# SELECT avg(a) FROM t_demo;
      avg
      ---------------------
      499977.020028900000
      (1 row)
      Time: 255.179 ms

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

        test=# SELECT avg(b) FROM t_demo;
        avg
        -------------------
        499983.2076499941
        (1 row)
        3
        Time: 267.371 ms

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

          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/

          相关实践学习
          使用PolarDB和ECS搭建门户网站
          本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
          阿里云数据库产品家族及特性
          阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
          目录
          相关文章
          |
          6月前
          【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
          【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
          37 0
          |
          2月前
          |
          C#
          C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
          C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
          37 1
          |
          7月前
          |
          存储 C语言
          C 语言实例 - 计算 int, float, double 和 char 字节大小
          C 语言实例 - 计算 int, float, double 和 char 字节大小。
          35 1
          Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
          Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
          Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
          |
          4月前
          牛客网刷题总结1.利用%符号获取特定位数的数字。2.强制类型转换 (将float转换为int )3.计算有关浮点型数据时,要注意你计算过程中所有的数据都是浮点型
          牛客网刷题总结1.利用%符号获取特定位数的数字。2.强制类型转换 (将float转换为int )3.计算有关浮点型数据时,要注意你计算过程中所有的数据都是浮点型
          24 0
          |
          6月前
          |
          存储 C语言
          计算 int, float, double 和 char 字节大小
          C 语言实例 - 计算 int, float, double 和 char 字节大小。
          44 1
          |
          7月前
          |
          存储 小程序 程序员
          8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
          8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
          64 0
          |
          9月前
          对int,char,float,double进行求和操作
          对int,char,float,double进行求和操作
          107 0
          |
          12月前
          |
          Python
          Python 数值类型方法|内建函数的对比汇总 (int bool float complex bytes str)
          Python 数值类型方法|内建函数的对比汇总 (int bool float complex bytes str)
          90 0
          Python 3 int 型最大值,float 型最大值
          Python 3 int 型最大值,float 型最大值
          Python 3 int 型最大值,float 型最大值

          热门文章

          最新文章