この投稿は Delphi Advent Calendar 2015 の21日目の記事です。
はじめに
同じコンポーネントを使っても、データベースに登録する方法は複数あります。
今回は、その方法の違いによるパフォーマンスの比較をしたいと思います。
確認方法
コンポーネントは、FireDACを使います。Delphiは、10 Seattle、データベースは、PostgreSQLを使いました。
データは、日本郵便株式会社のサイトからダウンロードした郵便番号データを使用しました。
件数は、123,907件です。項目は、新旧郵便番号と、県市区町村名のカナと漢字名で9項目のフィールド対象としています。
このデータをテーブルに追加する処理で確認します。
登録方法の比較は下記の3種類。すべて、TFDQueryを使います。
1)ChashUpdateを使用し、全件Append->Post後、ApplyUpdatesする。
2)Insert文を使い、ExecSQLで1件づつ全件登録します。
3)同じく、Insert文を使用し、配列DMLを使います。配列数は2パターン計測したものを示します。
計測結果
計測値です。それぞれ2回計測を行っています。
パターン | 1回目(hh:nn:ss.zzz) | 2回目(hh:nn:ss.zzz) |
1) | 00:04:23.610 | 00:06:49.251 |
2) | 00:01:22.688 | 00:02:21.500 |
3) ArraySize = 5000 | 00:00:07.126 | 00:00:07.031 |
3) ArraySize = 10 | 00:00:28.047 | 00:00:41.969 |
配列DMLでArraSizeが大きいものが圧倒的に早いようです。
データ移行や、バッチ系の処理で、処理時間が気になるようなときは、配列DMLが有効なようです。ArraySizeは、大きいほうがよいと言うこと上記からわかりますが、あまり大きくするとメモリのエラーが出ます。
最初、ArraySizeをデータ件数(123,907)にしたら駄目でした。1万件でも駄目で、上記5000件はOKでした。
その間は確認してません。このあたりはパラメータの項目数などによって、調整が必要なようです。
ここのQ4に情報があるようです。いまいち意味がわからないですが、結局環境によって違うってことなのかなと思います。
*2021/10/15 追記
配列DMLを使ってよくわからないエラーが出るときは、ArraySizeを減らしてみるとうまくいくケースがある。