my opinion is my own

PostgreSQL上のnumeric型とint型の性能差

PostgreSQLのマニュアルを見ていたらこんな記載が。

8.1. 数値データ型 https://www.postgresql.jp/document/11/html/datatype-numeric.html

numericの値に対する計算は整数型、もしくは次節で説明する浮動小数点データ型に比較し非常に遅くなります。

どのくらいの差が生じるのか気になったので実機で確認してみた。

numericのテーブル作成

CREATE TABLE t1(id numeric primary key,num text,data numeric,date timestamp with time zone);
postgres=> \d t1;
                         Table "public.t1"
 Column |           Type           | Collation | Nullable | Default 
--------+--------------------------+-----------+----------+---------
 id     | numeric                  |           | not null | 
 num    | text                     |           |          | 
 data   | numeric                  |           |          | 
 date   | timestamp with time zone |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)

integerのテーブル作成

CREATE TABLE t1(id numeric primary key,num text,data integer,date timestamp with time zone);
postgres=# \d t1;
                         Table "public.t1"
 Column |           Type           | Collation | Nullable | Default 
--------+--------------------------+-----------+----------+---------
 id     | numeric                  |           | not null | 
 num    | text                     |           |          | 
 data   | integer                  |           |          | 
 date   | timestamp with time zone |           |          | 
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)

データの大量生成(5000万件)

truncate table t1;
insert into t1
SELECT num                         a 
      ,'1'                         b
      ,floor(random() * 1000000)   c
      ,current_timestamp           d 
FROM   generate_series(1,50000000) num
;

余計な負荷が掛からないようにtimingで計測する。パラレルクエリで走らないようにパラメータを調整する。

\timing
SET max_parallel_workers_per_gather TO 0;

SELECT SUM(data) FROM t1;
SELECT AVG(data) FROM t1;
SELECT STDDEV(data) FROM t1;

キャッシュの影響を受けないように、念の為PostgreSQLの再起動とファイルシステム側のキャッシュのクリアをしている。

pg_ctl stop
sudo "echo 3 > /proc/sys/vm/drop_caches"
pg_ctl start

結果

回数が少ないので何とも言えないがこんな結果に。データ型の検討時には注意をしよう。

numeric integer 性能差
SUM 9403.565 8508.652 0.904833
AVG 8590.127 8886.078 1.034452
STDDEV 12419.859 8325.705 0.670354
---

関連しているかもしれない記事


#PostgreSQL