LoginSignup
0
0

比較してみた(PostgreSQLのunnest関数)

Posted at

はじめに

今回は、データの件数分、INSERT文を実行して登録するのと
PostgreSQLのunnest関数を使って、1度のINSERT文で登録することの比較をしました。
データ件数は1万件です。

結論

unnest関数を使ったほうが早かった(10秒くらい違う)
タイパというものが囁かれる今日この頃、先に結果だけ書かせて頂きました:bow:
具体的にどうやったの?など気になる方は読み進めて頂ければと:grinning:

きっかけ

業務での実装時に、登録処理の部分は
PostgreSQLのunnest関数を使った実装にしてねと指示頂く。
理由:性能が良いからとのこと。
それは本当なのか自分でも確認したくて比較を実施。

環境

PostgreSQL 13.2
A5:SQL Mk-2(SQLの実行時に使用)

サンプルコード

テーブルはINSERT文を実行するだけなので、制約などは何も設定せずです。
※unnest関数を使って登録するのがcolumn_1~column_3。他は固定値を登録。

table.sql
create table public.bulkinserttest (
  column_1 character varying(255)
  , column_2 character varying(255)
  , column_3 character varying(255)
  , userid character varying(20)
  , regdm character varying(20)
);

INSERT文
①unnest関数を使わない

insert_1.sql
-- 下記の感じで1万行用意
insert into bulkinserttest values ('test1','test2','test3','batch','20240128214000');
insert into bulkinserttest values ('test2','test3','test4','batch','20240128214000');
insert into bulkinserttest values ('test3','test4','test5','batch','20240128214000');

②unnest関数を使う

insert_2.sql
-- 「・・・」の部分に、他と同様にカンマ区切りで値入れ込む
insert into bulkinserttest values (
unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
,unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
,unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
, 'batch'
, '20240128214000'
);

検証

まずはunnest関数を使わない場合

実行前
image.png

実行→結果は約12秒でした
insert_1.sqlの実行結果.png

次はunnest関数を使った場合

実行前
image.png

ちゃんと1万個くらい用意:sweat_smile:
image.png

実行→結果は約0.1秒でした
insert_2.sqlの実行結果.png

おわりに

検証の結果、unnest関数を使うと約10秒くらい早くなりました。
(unnest関数の処理で1秒に満たないくらいの待ちは発生しますが)

今回のデータ件数は1万件でしたが
これが2万、3万と増えるにつれ
性能の差はもっと如実に出るのかもしれません。

ということで、今回はPostgreSQLのunnest関数を比較してみました。
次回以降のどこかで、実際にJavaとかで実装した時に
どうやってSQLの発行まで持って行くのかなども共有出来たらと思います。

最後までお読みいただきありがとうございました!:bow:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0