パフォーマンスチューニング9つの技 ~「探し」について~
今回は、実際の業務において押さえておきたいパフォーマンスチューニング手法の「探し」について解説します。ここでの「探し」とは、データベース内でアクセスすべきデータを効率的に絞り込んで探し出すことであり、時間がかかる処理や無駄な資源消費を排除することがテーマです。
探し
- ソート処理をインデックススキャンで代用する
- 検索方式Index Only Scanを活用する
- 複合インデックスは絞り込める順に記述する
- OR条件を工夫する
- 式インデックスを利用する
- 実行計画を見る
- 実行計画を制御する
- 統計情報を固定化する
- プリペアド文、コネクションプーリング、ユーザー定義関数を利用する
- フェッチサイズを調整する
今回の記事は、パフォーマンスチューニングの観点と仕組みを理解することに主眼を置いています。具体的な対処方法についてはシステムによって異なるため、マニュアルの確認や、各種チューニングサービスのご利用をご検討ください。なお、この記事で対象にしているPostgreSQLのバージョンは9.5以降です。
本記事の構成
本記事「パフォーマンスチューニング9つの技」は以下4つの記事から構成されています。他の記事も併せてご覧ください。
- パフォーマンスチューニング9つの技 ~はじめに~
- パフォーマンスチューニング9つの技 ~「書き」について~
- パフォーマンスチューニング9つの技 ~「探し」について~(本記事)
- パフォーマンスチューニング9つの技 ~「基盤」について~
1. パフォーマンスチューニングの「探し」とは
PostgreSQLは、SQLが発行されると、アクセス先のデータの特性を示す『統計情報』を参照し、一番効率の良いアクセス手順である『実行計画』を決定した上で、データベースへのアクセス処理を実行します。『実行計画』は、検索、結合、ソートなどの処理の階層的な組み合わせで構成されます。より効率的な『実行計画』が生成されるようにするためには、テーブルへの適切なインデックスを作成したり、SQL文の記述を工夫したりする必要があります。すると、アクセスするデータの範囲を効果的に絞り込まれてディスクI/Oが削減でき、また処理コストの低い手法で処理されるようになり、結果的にパフォーマンス向上につながります。図1に、今回説明するPostgreSQLのアーキテクチャー上の着目ポイントについて示します。

PostgreSQL全体の構成や、サーバープロセスの処理(パーサー、リライター、プランナー、エグゼキューター)の説明は、「PostgreSQLのアーキテクチャー概要」を参照してください。
ここで、実際のパフォーマンスチューニングをする上での基礎知識として、インデックスを定義することによる効果と、プランナーが作成する実行計画の見かたについて説明します。
1.1 インデックス定義の効果について
インデックスが存在しないテーブルからデータを検索する場合、テーブルの先頭レコード(タプル)から順に全データにアクセスするため、処理に時間を費やします。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
- テーブルのデータ量が多く、一部のレコードデータにのみアクセスする
- カラムにおける値のばらつきが大きい(カーディナリティーが高い)
Loading component...
1.2 プランナーが作成する実行計画の見かたについて
Loading component...
Loading component...
はじめに、各ノードの1行目の情報の意味について示します。
Loading component...
Loading component...
Loading component...
2. パフォーマンスチューニングの「探し」の技
ここからは、具体的なインデックスの活用例、最適な実行計画を生成する例、および、クライアント側でのSQLの書き方を工夫する方法について説明します。
2.1 インデックスを有効活用する
インデックスを活用しパフォーマンスを向上させるための手法を、いくつか紹介します。
ここでは以下の内容で説明します。
Loading component...
2.1.1 インデックス定義のより有効な活用方法
Loading component...
Loading component...
まずは、以下のSQLのように、ORDER BY句のc2、c3にインデックスを利用しないケースを見てみます。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
2.1.2 複合インデックス作成時のポイント
Loading component...
Loading component...
Loading component...
Loading component...
まずは、以下のSQLのように、カラムnumが範囲の条件になっているケースを見てみます。
Loading component...
Loading component...
Loading component...
比較のために、CREATE INDEXで指定するカラムの順を変更し、再度、実行計画を確認してみます。
Loading component...
Loading component...
2.1.3 SQL文記述時におけるインデックスの有効な利用方法
Loading component...
Loading component...
Loading component...
Loading component...
次に、実際の動作を確認してみます。準備として、以下のようなテーブルを作成し、テストデータも作成します。
Loading component...
カラムdateとtimeのインデックスを定義し、SELECT文の実行計画を確認してみると、インデックス検索2回とマージ処理1回の動作が行われている事が確認できます。
Loading component...
そこで、ORの両辺にあるdateの条件が両方とも date >= ‘2019/4/1’ を満たすので、この条件をANDで追加します。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
この場合にインデックスを利用するためには、以下のようにlower関数の結果をインデックスに定義します。
Loading component...
参考
Loading component...
【準備】
Loading component...
条件文のデータ型を等しく指定した場合(比較対象がinteger型)には、インデックスが利用されます。
Loading component...
Loading component...
Loading component...
2.2 実行計画を評価し制御する
Loading component...
Loading component...
Loading component...
以下のSELECT文について、実行計画を出力します。
Loading component...
Loading component...
参考
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
2.3 クライアント側で無駄を削減する
PostgreSQLのクライアント側でSQLを記述する際の工夫や、パフォーマンス改善につながる手法について紹介します。ここでは以下の内容で説明します。
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
Loading component...
PostgreSQLのパフォーマンスチューニングの重要なポイントである「探し」についての考え方と手法について解説しました。次回は、「基盤」をテーマに解説します。
2025年10月14日更新
こちらもおすすめ
Loading component...
Loading component...
富士通のソフトウェア公式チャンネル(YouTube)
富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。































