パフォーマンスチューニング9つの技 ~「基盤」について~
今回は、実際の業務において押さえておきたいパフォーマンスチューニング手法の「基盤」について解説します。ここでの「基盤」とは、PostgreSQL自体のアーキテクチャーを考慮の上、特にデータベース内部の機構が効率良く動作するよう調整することであり、データベースの設定ファイルpostgresql.confのパラメーターの見直しや資源の再構成を行いながら最適な状態にすることがテーマです。
基盤
- VACUUMで不要領域を再利用可能にする
- REINDEXで不要領域を削除する
- ANALYZEで統計情報を最新化する
- VACUUM FREEZEでトランザクションIDを凍結状態にする
- 作業メモリーサイズ、遺伝的問合せ最適化、プランナー推定コスト、並列処理、コンフリクト軽減のためのパラメーターを調整する
- テーブルスペースやパーティショニングを活用する
- ロック競合を軽減する
今回の記事は、パフォーマンスチューニングの観点と仕組みを理解することに主眼を置いています。具体的な対処方法についてはシステムによって異なるため、マニュアルの確認や、各種チューニングサービスのご利用をご検討ください。なお、この記事で対象にしているPostgreSQLのバージョンは9.5以降です。
本記事の構成
本記事「パフォーマンスチューニング9つの技」は以下4つの記事から構成されています。他の記事も併せてご覧ください。
- パフォーマンスチューニング9つの技 ~はじめに~
- パフォーマンスチューニング9つの技 ~「書き」について~
- パフォーマンスチューニング9つの技 ~「探し」について~
- パフォーマンスチューニング9つの技 ~「基盤」について~(本記事)
1. パフォーマンスチューニングの「基盤」とは
PostgreSQLでは、追記型アーキテクチャーが採用されており、様々なシステム要件や状況に応じて、この機構が効果的に動作し、想定どおりのパフォーマンスを発揮できるよう、設定ファイルpostgresql.confのパラメーターで調整が行えるよう設計されています。また、資源を分散する機能などもあります。このような、PostgreSQLの「基盤」部分に対するパフォーマンスチューニングには、図1に示すような、いくつかの対処すべきポイントがあります。これらのポイントは、実際の運用時と同様の状況でPostgreSQLを動作させないと、正しく対処ができないものもあります。これらのチューニングポイントについて、順に説明していきます。

PostgreSQL全体の構成についての説明は「PostgreSQLのアーキテクチャー概要」を参照してください。
2. パフォーマンスチューニングの「基盤」の技
PostgreSQLの内部で扱うデータが効率よく処理され、データベースのパフォーマンスを向上させることを目的とした、設定ファイルpostgresql.confのパラメーターの調整方法になどについて説明します。
2.1 データを整理し、統計情報を最新化する
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
autovacuumに関する設定ファイルpostgresql.confのパラメーターとしては、以下のものがあります。
Loading component...
Loading component...
上記はPostgreSQL全体に影響するパラメーターですが、テーブルごとにVACUUMの条件を変更することができます。CREATE TABLEやALTER TABLEコマンドの格納パラメーターが準備されています。
Loading component...
Loading component...
Loading component...
Loading component...
その後、autovacuumが動作した後の結果を示します。不要レコードの割合が「50レコード + 0.2 × レコード数」を超えているテーブルpgbench_branches、pgbench_tellersの不要レコードがVACUUMによって回収されていることが分かります。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Windowsの場合、上記の1.から3.の手順を手動で行うことで同様の対応は可能です。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
このトランザクションIDの凍結処理には以下の2つの機構が存在し、これらはパフォーマンス劣化につながることがあります。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
参考
PostgreSQLは、テーブル内の各レコードにシステム列(oid, tableoid, xmin, cmin, xmax, cmax, ctid)を持っており、その情報はレコードデータのヘッダー部分などに格納されています。
Loading component...
Loading component...
2.2 パラメーター調整で高速化する
設定ファイルpostgresql.confに記述できるパラメーターの中で、PostgreSQLの内部処理をコントロールすることでパフォーマンス改善が可能なパラメーターについて説明します。
Loading component...
Loading component...
Loading component...
Loading component...
注1:遺伝的問い合わせ最適化(GEQO)
ヒューリスティック(発見的)検索法を用いて実行計画を選択する演算手法であり、多くのテーブルを結合するような複雑な問い合わせに対して、計画時間を軽減します。
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...
・プライマリー側で、VACUUMまたはHOTによる行データの回収処理が実行される場合(頻繁な更新がある場合)
Loading component...
Loading component...
なお、コンフリクトを完全に無くすことは非常に難しいため、これらの対策と併せて、アプリケーション側の参照処理には、再実行処理を入れておく必要があります。
2.3 資源分割とロック回避で高速化する
テーブルスペースやパーティショニングを利用することで高速に処理する方法、また、PostgreSQL内部処理に必要なロックレベルを意識した設計が必要な点について説明します。
Loading component...
Loading component...
参考
ディスクI/Oの分散については、使用するディスクにRAID構成を組んでおくことで、さらに効果が見込めます。参照主体ならRAID 5、更新主体ならRAID 1+0 の構成が一般的です。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
2021年8月27日更新
こちらもおすすめ
Loading component...
Loading component...
Loading component...
富士通のソフトウェア公式チャンネル(YouTube)
富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。












