このドキュメントでは、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。各クエリ 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 個の固有プランを保存できますが、保持ポリシーは提供されません。