このドキュメントでは、AlloyDB for PostgreSQL のクエリプラン管理を使用してクエリプランのパフォーマンスを改善する方法について説明します。クエリプラン管理は、データベース内のすべてのクエリプランとその実行に関する統計情報を継続的にトラッキングします。クエリとそれに関連する費用を確認したうえで、プランを承認できます。このプランは、特定のクエリに一貫して適用されます。このアプローチにより、費用対効果の高いクエリプランを選択でき、クエリのパフォーマンスが向上します。
仕組み
PostgreSQL では、クエリ オプティマイザーが推定費用に基づいて各クエリの実行プランを選択します。クエリの費用には、クエリ パラメータ、クエリの複雑さ、テーブルのサイズ、使用可能なインデックス、システム リソースなど、さまざまな要因が影響します。
クエリ パラメータはクエリを実行するたびに変更される可能性があるため、クエリプランを動的に選択しても、必ずしも最適な結果が得られるとは限りません。クエリを処理する際に、オプティマイザーはさまざまな実行プランを評価し、最も費用対効果の高いプランを選択しようとします。
パラメータを変更すると、プランが変更されることがあります。通常、最も費用対効果の高いプランが選択されますが、場合によっては費用対効果の低いプランが選ばれ、クエリのパフォーマンスが低下する場合があります。クエリプラン管理を使用すると、オプティマイザーによって生成されたパターンとプランを把握できるので、各プランを確認して情報に基づいた意思決定を行うことができます。
クエリプラン管理の主なコンポーネントは次の 2 つです。
- クエリプラン リポジトリ
- データベースのクエリプラン管理を有効にすると、プラン リポジトリはデータベースのプランおよび実行に関する統計情報を、時系列でトラッキングし始めます。クエリプラン リポジトリは、クエリプランのパフォーマンスに関するオブザーバビリティを提供します。
- プランの管理
- 使用可能なプランを確認したら、プラン管理コンポーネントを使用して、特定のクエリ テンプレートの 1 つ以上のプランを承認できます。クエリプラン管理は、これらの承認されたプランをトラッキングし、その後クエリが実行される際に、クエリ オプティマイザーが承認されたプランのいずれかのみを使用するようにします。複数のプランが承認されている場合は、AlloyDB が予想される費用が最も低いプランを選択して実行します。
始める前に
google_plan_management.enabledデータベース フラグをonに設定します。詳細については、データベース フラグを構成するをご覧ください。- データベースに
google_plan_management拡張機能を作成します。詳細については、拡張機能を有効にするをご覧ください。 クエリプラン管理を使用して、クエリプランを管理するデータベースのユーザーに
google_plan_management_roleを付与します。Google Cloud コンソールで、AlloyDB の [クラスタ] ページに移動します。
必要なインスタンスをクリックします。
[AlloyDB Studio] をクリックし、[エディタ 1] タブをクリックします。
次のクエリを入力します。
GRANT google_plan_management_role TO DATABASE_USER;DATABASE_USERは、ロールを付与するユーザーに置き換えます。[実行] をクリックします。
トラッキング対象のクエリプランを確認する
クエリプラン管理には、トラッキング対象のすべてのクエリプラン、実行時間、その他の情報を確認できるクエリプラン ビューが備わっています。トラッキング対象のクエリプランとは、オプティマイザーによって生成され、プラン リポジトリに保存されたクエリプランのことです。
トラッキング対象となる過去のプランを確認するには、次のクエリを実行します。
SELECT * FROM google_plan_management.tracked_plans_view;
レスポンスは次の例のようになります。
db_id | 5
db_name | postgres
user_id | 16392
user_name | postgres
logical_query_id | 15480571796188147798
plan_id | 4740866759615354783
query | SELECT c1, c2, c3 FROM t1 WHERE c1 = 1;
plan | Seq Scan on public.t1 +
| Output: c1, c2, c3 +
| Filter: (t1.c1 = ?)
total_execution_time | 0.003937501
num_executions | 1
creation_time | 2024-11-06 16:52:25.200737+00
last_used_time | 2024-11-06 16:52:25.200737+00
クエリプランのトラッキングを無効にする
オプティマイザーによって生成されたクエリプランをクエリプラン管理でトラッキングしないようにするには、google_plan_management.enable_track_plans データベース フラグを無効にする必要があります。このフラグはデフォルトで有効になっています。有効のままにしておくことをおすすめします。詳細については、データベース フラグを構成するをご覧ください。
管理対象のプランを確認する
承認したプランや拒否したプランなど、クエリプラン管理で管理されているすべてのクエリとプランを確認できます。
管理対象のプランを確認するには、次のクエリを実行します。
SELECT * FROM google_plan_management.managed_plans_view;
レスポンスは次の例のようになります。
db_id | 5
db_name | postgres
user_id | 16392
user_name | postgres
logical_query_id | 15480571796188147798
plan_id | 4740866759615354783
status | approved
プランを承認する
オプティマイザーはクエリプランを動的に選択します。そのため、同じクエリに対して異なる時間に異なるクエリプランを選択する可能性があります。プランの選択を一貫させるには、クエリプラン管理を使用して、特定のクエリに対して 1 つ以上のクエリプランを承認します。
複数のプランを承認すると、クエリプラン管理は承認されたすべてのプランを比較し、クエリ実行に最も費用対効果の高いプランを選択します。
クエリのプランを評価して承認する手順は次のとおりです。
オプティマイザーが生成したトラッキング対象のプランを確認し、レスポンス内の
logical_query_idを特定します。logical_query_idに対して生成されたすべてのプランを確認します。total_execution_timeとnum_executionsの値を使用して各プランの平均実行時間を計算し、クエリに最適なプランを決定できます。plan列には、使用されたインデックスや使用された並べ替え方法といった、クエリプランの決定に役立つ詳細情報も含まれています。次のクエリを実行して、クエリに適用するプランを承認します。
SELECT google_plan_management.approve_plan(QUERY_ID, PLAN_ID);次のように置き換えます。
QUERY_ID: クエリの一意のlogical_query_id。1 つのクエリ ID に対して複数のプラン ID が関連付けられている場合があります。PLAN_ID: クエリの一意のplan_id。
プランを拒否する
クエリに対して承認されたプランを拒否し、クエリプラン管理がクエリにそのプランを適用しないようにすることができます。承認されなかったプランは削除されず、トラッキング対象のプランの一覧に表示されます。
承認されたプランを拒否するには、次のクエリを実行します。
SELECT google_plan_management.deny_plan(QUERY_ID, PLAN_ID);
承認されたプランを削除する
承認されたプランは、プラン リポジトリから削除できます。承認されたプランを削除すると、そのプランは管理対象のプランの一覧に表示されなくなります。
承認されたプランを削除するには、次のクエリを実行します。
SELECT google_plan_management.update_plan_status(QUERY_ID, PLAN_ID, 'delete');
承認されたプランの使用を一時的に停止する
クエリに対して承認されたプランの使用を一時的に停止する場合は、google_plan_management.enable_steer_plans データベース フラグを無効にする必要があります。このフラグは、デフォルトで有効になっています。詳細については、データベース フラグを構成するをご覧ください。
制限事項
- クエリプラン管理は、パーティション分割テーブルまたはグループ化セットでは使用できません。
- クエリプラン管理は、プライマリ インスタンスでのみサポートされています。
- クエリプラン リポジトリには最大 100,000 個の一意のプランを保存できますが、保持ポリシーは提供されていません。