

# Aurora PostgreSQL クエリ計画管理のベストプラクティス
<a name="AuroraPostgreSQL.Optimize.BestPractice"></a>

クエリ計画管理を使用すると、クエリ実行計画の変更方法と変更時期を制御できます。DBA として、QPM を使用する際の主な目標は、データベースに変更があったときのリグレッションの防止と、オプティマイザが新しい計画を使用できるかどうかの制御です。クエリ計画管理の使用に関する推奨されるベストプラクティスについて、以下に示します。事前予防型および事後対応型の計画管理アプローチでは、新しい計画の使用を承認する方法とタイミングが異なります。

**Contents**
+ [パフォーマンス低下を防止する事前予防型の計画管理](#AuroraPostgreSQL.Optimize.BestPractice.Proactive)
  + [メジャーバージョンのアップグレード後の計画の安定性の確保](#AuroraPostgreSQL.Optimize.BestPractice.MajorVersionUpgrade)
+ [パフォーマンス低下を検出して修復する事後対応型の計画管理](#AuroraPostgreSQL.Optimize.BestPractice.Reactive)

## パフォーマンス低下を防止する事前予防型の計画管理
<a name="AuroraPostgreSQL.Optimize.BestPractice.Proactive"></a>

計画のパフォーマンス低下を防止するには、新しく検出された計画のパフォーマンスを、承認済み計画の既存のベースラインのパフォーマンスと比較し、最速の計画セットを新しいベースラインとして自動的に承認する手順を実行して、計画ベースラインを進化させます**。このように、より速い計画が検出されるにつれて、時間とともに計画のベースラインが改善されます。

1. 開発環境で、パフォーマンスまたはシステムのスループットに最も大きな影響を与える SQL ステートメントを特定します。その後、[特定の SQL ステートメントの計画の手動取り込み](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Manual) と [自動的な計画の取得](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic) の説明に従ってこれらのステートメントの計画を取得します。

1. 取得した計画を開発環境からエクスポートし、それらを実稼働環境にインポートします。詳細については、「[Aurora PostgreSQL の管理計画のエクスポートとインポート](AuroraPostgreSQL.Optimize.Maintenance.ExportingImporting.md)」を参照してください。

1. 実稼働環境で、アプリケーションを実行し、承認された管理計画の使用を強制します。詳細については、「[Aurora PostgreSQL 管理計画を使用する](AuroraPostgreSQL.Optimize.UsePlans.md)」を参照してください。アプリケーションの実行中にオプティマイザが新しい計画を発見したときは、それらも追加します。詳細については、「[自動的な計画の取得](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)」を参照してください。

1. 未承認の計画を分析し、適切に機能する計画を承認します。詳細については、「[計画パフォーマンスの評価](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)」を参照してください。

1. アプリケーションが継続して実行されている間、オプティマイザは必要に応じて新しい計画を使用し始めます。

### メジャーバージョンのアップグレード後の計画の安定性の確保
<a name="AuroraPostgreSQL.Optimize.BestPractice.MajorVersionUpgrade"></a>

PostgreSQL の各メジャーバージョンには、パフォーマンスを向上させるために設計されたクエリオプティマイザの機能強化と変更が含まれています。ただし、以前のバージョンでオプティマイザーによって生成されたクエリ実行プランは、アップグレードされた新しいバージョンではパフォーマンスが低下する可能性があります。クエリプラン管理を使用して、これらのパフォーマンス問題を解決し、メジャーバージョンアップグレード後のプランの安定性を確保できます。

オプティマイザは、同じステートメントに承認されたプランが複数存在していても、常に最小コストのプランを使用します。アップグレード後、オプティマイザは新しいプランを検出する場合がありますが、それらは未承認プランとして保存されます。これらのプランは、unapproved\$1plan\$1execution\$1threshold パラメータによるリアクティブスタイルのプラン管理を使用して承認された場合にのみ実行されます。evolve\$1plan\$1baselines パラメータを使ったプロアクティブスタイルのプラン管理を使用すると、プランの安定性を最大限に高めることができます。これにより、新しいプランと古いプランのパフォーマンスが比較され、次善のプランよりも 10% 以上早いプランが承認または却下されます。

アップグレード後、`evolve_plan_baselines` 関数を使用して、クエリパラメータをバインドしながらアップグレード前とアップグレード後のプランのパフォーマンスを比較できます。以下のステップでは、「[Aurora PostgreSQL 管理計画を使用する](AuroraPostgreSQL.Optimize.UsePlans.md)」で説明されているように、実稼働環境で承認済みのマネージドプランを使用していることを前提としています。

1. アップグレードする前に、クエリプランマネージャーを実行している状態でアプリケーションを実行します。アプリケーションの実行中にオプティマイザが新しいプランを発見したときは、それらも追加します。詳細については、「[自動的な計画の取得](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)」を参照してください。

1. 各プランのパフォーマンスを評価します。詳細については、「[計画パフォーマンスの評価](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance)」を参照してください。

1. アップグレード後、`evolve_plan_baselines` 関数を使用して、承認済みのプランを再度分析します。クエリパラメータバインディングの使用前後のパフォーマンスを比較します。新しいプランが速い場合は、承認済みのプランに追加できます。同じパラメータバインディングの別のプランよりも速い場合は、遅いプランを「拒否」としてマークできます。

   詳細については、「[より優れた計画の承認](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance.Approving)」を参照してください。この関数の詳細については、「[apg\$1plan\$1mgmt.evolve\$1plan\$1baselines](AuroraPostgreSQL.Optimize.Functions.md#AuroraPostgreSQL.Optimize.Functions.evolve_plan_baselines)」を参照してください。

詳細については、「[Amazon Aurora PostgreSQL 互換エディションのクエリ計画管理により、メジャーバージョンのアップグレード後に一貫したパフォーマンスを確保する](https://aws.amazon.com/blogs/database/ensuring-consistent-performance-after-major-version-upgrades-with-amazon-aurora-postgresql-query-plan-management/)」を参照してください。

**注記**  
論理レプリケーションまたはを使用してメジャーバージョンアップグレードを実行する場合はAWS DMS、アップグレードしたインスタンスに既存のプランが確実にコピーされるように、`apg_plan_mgmt`スキーマを必ず複製してください。論理レプリケーションの詳細については、「[論理レプリケーションを使用して Aurora PostgreSQL のメジャーバージョンアップグレードを実行する](AuroraPostgreSQL.MajorVersionUpgrade.md)」を参照してください。

## パフォーマンス低下を検出して修復する事後対応型の計画管理
<a name="AuroraPostgreSQL.Optimize.BestPractice.Reactive"></a>

アプリケーションの実行をモニタリングすることによって、パフォーマンスの低下を引き起こす計画を検出できます。パフォーマンス低下を検出したときは、以下のステップに従って、不適切な計画を手動で拒否または修正します。

1. アプリケーションの実行中に、管理計画の使用を強制し、新しく検出された計画を未承認として自動的に追加します。詳細については、「[Aurora PostgreSQL 管理計画を使用する](AuroraPostgreSQL.Optimize.UsePlans.md)」および「[自動的な計画の取得](AuroraPostgreSQL.Optimize.CapturePlans.md#AuroraPostgreSQL.Optimize.CapturePlans.Automatic)」を参照してください。

1. 実行中のアプリケーションのパフォーマンス低下をモニタリングします。

1. 計画のパフォーマンス低下を発見した場合、計画のステータスを `rejected` に設定します。次に SQL ステートメントを実行する際、オプティマイザは拒否された計画を自動的に無視し、代わりに別の承認済み計画を使用します。詳細については、「[低速な計画の拒否または無効化](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.EvaluatingPerformance.Rejecting)」を参照してください。

   場合によっては、不適切な計画を拒否、無効化、削除せずに、修正した方が良いこともあります。計画の改善を試すには、`pg_hint_plan` エクステンションを使用してください。`pg_hint_plan` では、特別なコメントを使用して、オプティマイザに通常の計画作成方法を上書きするよう指示します。詳細については、「[pg\$1hint\$1plan を使用した計画の修正](AuroraPostgreSQL.Optimize.Maintenance.md#AuroraPostgreSQL.Optimize.Maintenance.pg_hint_plan)」を参照してください。