はじめに
今回は、データの件数分、INSERT文を実行して登録するのと
PostgreSQLのunnest関数を使って、1度のINSERT文で登録することの比較をしました。
データ件数は1万件です。
結論
unnest関数を使ったほうが早かった(10秒くらい違う)
タイパというものが囁かれる今日この頃、先に結果だけ書かせて頂きました
具体的にどうやったの?など気になる方は読み進めて頂ければと
きっかけ
業務での実装時に、登録処理の部分は
PostgreSQLのunnest関数を使った実装にしてねと指示頂く。
理由:性能が良いからとのこと。
それは本当なのか自分でも確認したくて比較を実施。
環境
PostgreSQL 13.2
A5:SQL Mk-2(SQLの実行時に使用)
サンプルコード
テーブルはINSERT文を実行するだけなので、制約などは何も設定せずです。
※unnest関数を使って登録するのがcolumn_1~column_3。他は固定値を登録。
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関数を使わない
-- 下記の感じで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 into bulkinserttest values (
unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
,unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
,unnest(ARRAY['test1','test2','test3',・・・,'test10000'])
, 'batch'
, '20240128214000'
);
検証
まずはunnest関数を使わない場合
次はunnest関数を使った場合
おわりに
検証の結果、unnest関数を使うと約10秒くらい早くなりました。
(unnest関数の処理で1秒に満たないくらいの待ちは発生しますが)
今回のデータ件数は1万件でしたが
これが2万、3万と増えるにつれ
性能の差はもっと如実に出るのかもしれません。
ということで、今回はPostgreSQLのunnest関数を比較してみました。
次回以降のどこかで、実際にJavaとかで実装した時に
どうやってSQLの発行まで持って行くのかなども共有出来たらと思います。
最後までお読みいただきありがとうございました!