パフォーマンスチューニング9つの技 ~「書き」について~

今回は、実際の業務において押さえておきたいパフォーマンスチューニング手法の「書き」について解説します。ここでの「書き」とは、テーブルデータの更新だけでなく、同時に行われるインデックスの更新やトランザクションログ書き出し、チェックポイント処理などのデータ更新処理が対象であり、この際に発生する無駄なディスクI/Oを可能な限り削減することがテーマです。これは、パフォーマンスチューニングにおいて一番重要な点になります。

書き

書込み保証を見極める
  • 各種バッファーのサイズや、チェックポイント処理などのディスク書き込みタイミングを調整する
インデックスの更新を抑止する
  • 大量データ挿入時は一時的にインデックスを外す
  • 更新頻度が高い場合はFILLFACTORやHOTを利用する
大量データは一括 / 並列で格納する
  • COPYコマンドの利用や多重実行でデータを格納する

今回の記事は、パフォーマンスチューニングの観点と仕組みを理解することに主眼を置いています。具体的な対処方法についてはシステムによって異なるため、マニュアルの確認や、各種チューニングサービスのご利用をご検討ください。なお、この記事で対象にしているPostgreSQLのバージョンは9.5以降です。

本記事の構成

本記事「パフォーマンスチューニング9つの技」は以下4つの記事から構成されています。他の記事も併せてご覧ください。

1. パフォーマンスチューニングの「書き」とは

一般的にデータベースは、大量データを扱い、大量の問い合わせや更新を高速に処理し、さらに障害発生時にはCOMMITされたデータを保証するための仕組みを持っています。そのため、データの参照や更新は極力メモリー上で行い、ディスクへのアクセスは最小限のコストで行えるよう効率化されています。しかし、データベースに対するシステム要件は様々であり、その要件に合わせて、適切なサイズのメモリーを割り当てたり、ディスクへの書き出しタイミングを調整したりすることで、ディスクI/Oの回数や量を減らし、パフォーマンス向上につなげていく事ができます。
ただし、ディスクI/Oを減らす施策だけを行うと、障害発生時の復旧時間が長くなったり、最新の状態に復旧できなくなったりするデメリットがあります。そのため、システム要件に見合った最適なバランスを考えることが大切です。
これらを考慮して最もボトルネックになりやすいディスクI/Oを削減することが「書き」のポイントであり、それを実現するためには、PostgreSQLの書き込み保証のメカニズムの理解が必要です。以下に、その書き込み保証メカニズムの概要図を示し、その動作について説明します。

PostgreSQLの書き込み保証メカニズム
図1 PostgreSQLの書き込み保証メカニズム

各プロセス、メモリー、ファイルの説明は、「PostgreSQLのアーキテクチャー概要」を参照してください。

1.1 書き込み保証のメカニズムについて

Loading component...

Loading component...

Loading component...

(3)(1)(2)を繰り返した後にCOMMITが実行されると、WALバッファーにCOMMITしたことを書き出し、それまでのWALバッファーの情報をWALファイルに書き出します。

Loading component...

(4)定期的なチェックポイント処理により、共有バッファーの更新されたデータページ(ダーティページ)をデータファイルに書き出します。なお、チェックポイント処理が終了したことで不要になったWALファイルは削除します。

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

2. パフォーマンスチューニングの「書き」の技

Loading component...

2.1 書込み保証を見極める

Loading component...

Loading component...

Loading component...

参考

PostgreSQLのコネクション数、アクセスするテーブル、および、利用するカーソルが多い場合に、共用バッファーの確保ができないと、以下のエラーが起きることがあります。

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

参考

Loading component...

Loading component...

Loading component...

Loading component...

参考

Loading component...

2.2 インデックスの更新を抑止する

ここでは、大量データを扱う場合、および、更新が頻繁に発生するテーブルを利用する場合のインデックスの扱いについて、以下の内容で説明します。

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

Loading component...

CREATE INDEXによりインデックスを作成するときは、ソートされたレコードからデータを取り出しながら格納していくため、リーフページは、FILLFACTORの割合で格納された状態で作成されます。

Loading component...

Loading component...

2.3 大量データは一括/並列で格納する

データを高速に格納するための方法について説明します。

大量データはCOPYコマンドで格納する

大量データを挿入する場合には、INSERT文で実施するよりもCOPYコマンドにより一括で格納する方が高速に格納できます。

Loading component...

Loading component...

Loading component...

PostgreSQLのパフォーマンスチューニングの一番重要なポイントである「書き」についての考え方と手法について解説しました。次回は、「探し」をテーマに解説します。

2022年3月25日更新

こちらもおすすめ

Loading component...

Loading component...

富士通のソフトウェア公式チャンネル(YouTube)

富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。

Loading component...

Loading component...