パフォーマンスチューニング9つの技 ~はじめに~
PostgreSQLインサイド

PostgreSQLを利用する上で、CPU、メモリー、ディスクなどのリソースを有効に使うためには、パフォーマンスチューニングが必要になります。実際に、PostgreSQLのパフォーマンスを引き出すための手法は数多くありますが、その手法を整理するといくつかの観点が見えてきます。これから、「パフォーマンスチューニング9つの技」と題して、実際の業務において押さえておくべきパフォーマンスチューニングの手法について、「書き」「探し」「基盤」の3つの観点に分けて解説していきます。以下に、「パフォーマンスチューニング9つの技」の全体概要を示します。

パフォーマンスチューニング9つの技 内容
書き 書込み保証を見極める
  • 各種バッファーのサイズや、チェックポイント処理などのディスク書き込みタイミングを調整する
インデックスの更新を抑止する
  • 大量データ挿入時は一時的にインデックスを外す
  • 更新頻度が高い場合はFILLFACTORやHOTを利用する
大量データは一括 / 並列で格納する
  • COPYコマンドの利用や多重実行でデータを格納する
探し インデックスを有効活用する
  • ソート処理をインデックススキャンで代用する
  • 検索方式Index Only Scanを活用する
  • 複合インデックスは絞り込める順に記述する
  • OR条件を工夫する
  • 式インデックスを利用する
実行計画を評価し制御する
  • 実行計画を見る
  • 実行計画を制御する
  • 統計情報を固定化する
クライアント側で無駄を削減する
  • プリペアド文、コネクションプーリング、ユーザー定義関数を利用する
  • フェッチサイズを調整する
基盤 データを整理し、統計情報を最新化する
  • VACUUMで不要領域を再利用可能にする
  • REINDEXで不要領域を削除する
  • ANALYZEで統計情報を最新化する
  • VACUUM FREEZEでトランザクションIDを凍結状態にする
パラメーター調整で高速化する
  • 作業メモリーサイズ、遺伝的問合せ最適化、プランナー推定コスト、並列処理、コンフリクト軽減のためのパラメーターを調整する
資源分割とロック回避で高速化する
  • テーブルスペースやパーティショニングを活用する
  • ロック競合を軽減する

今回は、これらの説明に入る前に、パフォーマンスチューニングの考え方について説明します。なお、この記事で対象にしているPostgreSQLのバージョンは9.5以降です。

本記事の構成

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

1. パフォーマンスチューニングとは

パフォーマンスチューニングとは、システムを構成するCPU、メモリー、ディスク、ネットワークなどのハードウェア、OS資源などのリソースをより有効に利用できるよう調整し、システムのパフォーマンスを引き出すことです。データベースにおいては、クライアントからの大量接続や、同一資源への同時アクセス、あらゆる障害に対応するためのデータ保証など、多くの機構を備えています。これらの機構をバランスよく、効率的に動作するよう正しく調整することで、SQLを高速に処理し、レスポンス向上につなげることができます。そのためには、PostgreSQLのアーキテクチャーを理解すること、および、ボトルネックが発生する箇所を押さえておくことが重要です。以下に、PostgreSQLの基本的なアーキテクチャーと、ボトルネックが発生する代表的な箇所を示します。

図1 PostgreSQLのアーキテクチャーとボトルネックが発生する代表的な個所

なお、「PostgreSQLのアーキテクチャー概要」にパフォーマンスチューニングを知る上で必要な情報が掲載されていますので、必要に応じて参照してください。

本記事においては、パフォーマンスチューニングを行う上で考慮すべき観点を以下の3つに分類し説明していきます。

  1. 「書き」
    パフォーマンスチューニングで一番重要な点は、データ更新処理で発生するディスクI/Oを削減することです。データベースでは、パフォーマンスを向上させるために極力メモリー上で処理を行いますが、データの信頼性を担保するため、COMMIT時やチェックポイント処理時には、効率的にメモリー上のデータをディスクに書き込む必要があります。この書き込み処理が効率的に行われないことで様々なボトルネックの発生につながります。本記事では、それらの考慮を含め、「書き」と表現して分類します。
  2. 「探し」
    次に重要な点は、効率的なデータアクセスです。データベース内のデータにアクセスする際に、無駄な処理や資源消費をしないよう対処することで、パフォーマンスを向上させることができます。具体的には、適切なSQL文を書くことと、最新の統計情報を基に、最適な実行計画が作成されるように運用することです。また、クライアント側での対応として、プリペアド文の利用で同様の問合せをキャッシュしたり、コネクションプーリングによる接続のオーバーヘッドを解消したりするなどの、効率化の機構も積極的に活用していくべきです。本記事では、これらを「探し」と表現して分類します。
  3. 「基盤」
    その次に重要な点は、PostgreSQL自体のアーキテクチャーを考慮することです。PostgreSQLでは、追記型アーキテクチャーを採用しています。その機構を効果的に利用できるようにするため、設定ファイルpostgresql.confのパラメーターの調整や資源の再構成を行いながら最適化していくことです。また、資源を分散する機能や、ロックレベルの考慮によりロック競合を削減し、オーバーヘッドを減らすこともできます。本記事では、これらを「基盤」と表現して分類します。

2. パフォーマンスチューニングの考え方

ここでは、パフォーマンスチューニングについて、実施するタイミングと基本的な流れについて説明します。

どのタイミングで行うか

データベースシステムのパフォーマンスチューニングの考慮と対策は、システム開発のほぼすべての工程において必要になります。そして、後工程で対策するほど手戻りが発生して工数が大きくなる傾向があるため、できるだけ早い段階で対策することがシステム開発全体のコスト削減につながります。また、運用 / 保守においても、データ量やアクセス量などの変化、保守開発における機能追加などの変化に伴ってパフォーマンスチューニングを実施する必要があります。

図2 パフォーマンスチューニングのタイミング

パフォーマンスチューニングの基本的な流れ

パフォーマンスチューニングは、基本的に以下の流れで行います。

  • (1)性能要件を満たすための性能目標値を設定します。性能の指標は、スループット(TPS)、レスポンスタイム(レイテンシー)などです。
  • (2)評価方法を決め、実際にデータベースを動作させて、性能測定を実施します。その結果を検証し、ボトルネックを検出します。できる限り実際の運用環境と同様の条件で行います。
  • (3)検出されたボトルネックの原因を正しく特定し、適切なチューニングを実施します。
  • (4)再度、性能測定を実施し、効果を確認します。性能目標値をクリアできなかった場合は、別の場所にボトルネックがある可能性があるため、再度(2)に戻って、性能測定を実施し、チューニングを繰返します。
  • (5)性能目標値をクリアした時点で、チューニングが完了となります。

図3 パフォーマンスチューニングの基本的な流れ

今回は、PostgreSQLのパフォーマンスチューニングの考え方を述べました。次回から、具体的なパフォーマンスチューニングの手法について説明します。

2021年3月12日公開

オンデマンド(動画)セミナー

    • PostgreSQLに関連するセミナー動画を公開中。いつでもセミナーをご覧いただけます。
      • 【事例解説】運送業務改革をもたらす次世代の運送業界向けDXプラットフォームの構築
      • ハイブリッドクラウドに最適なOSSベースのデータベースご紹介

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ