このページでは、データベースでアクティブなクエリをモニタリングしてトラブルシューティングする方法について説明します。アクティブなクエリとは、パフォーマンスに影響する可能性があるデータベース上で長時間実行されているクエリのことです。これらのクエリをモニタリングすることで、システムのレイテンシが発生している原因と CPU 使用率が高い原因を特定しやすくなります。
アクティブなクエリは、[Query Insights] ダッシュボードに表示できます。これらのクエリは、トランザクションの開始時間順に表示されます。実行中のクエリが大量にある場合、システムがこのデータの収集に適用するメモリの制約により、結果には全クエリの一部しか表示されない可能性があります。
始める前に
アクティブ クエリの表示を開始するには、高度な Query Insights 機能を有効にして、インスタンスのアクティブ クエリ分析を有効にする必要があります。手順は以下のとおりです。
Google Cloud コンソールで [クラスタ] ページに移動します。
クラスタとインスタンスのリストで、[プライマリ] インスタンスまたは [読み取りプール] インスタンスをクリックします。
[Query Insights] をクリックします。
[設定を編集] をクリックします。
[Query Insights の設定を編集] ウィンドウで、[AlloyDB の高度なクエリ分析機能を有効にする] > [アクティブ クエリ分析] を選択します。
[変更を保存] をクリックします。
[ID を変更した後は再起動が必要です] ウィンドウで、[確認して再起動] をクリックします。
Gemini Cloud Assist アシスタントを使用すると、AlloyDB for PostgreSQL リソースのモニタリングとトラブルシューティングを行うことができます。詳細については、Gemini の支援機能によるモニタリングとトラブルシューティングをご覧ください。
アクティブ クエリを表示する
アクティブ クエリを表示するには、次のことを行います。
カスタムロールを作成して、
databaseinsights.monitoringViewer
Identity and Access Management(IAM)権限を追加します。アクティブ クエリを表示するユーザーごとに、このロールを追加します。
Google Cloud コンソールで、[AlloyDB] ページを開きます。
クラスタの名前をクリックして、[概要] ページを開きます。
[Query Insights] タブを選択します。[Query Insights] ダッシュボードには、選択したクラスタの詳細が表示されます。
[アクティブなクエリのビュー] タブをクリックします。このタブには、実行中のアクティブなクエリのサマリーと、長時間実行トランザクション上位 50 件が表示されます。
この情報は以下のいずれかの項目でフィルタできます。
- データベース: 特定またはすべてのデータベースのクエリ負荷がフィルタされます。
- ユーザー: 特定のデータベース ユーザーまたはすべてのユーザーからのクエリ負荷がフィルタされます。
- ノード ID: 読み取りプール インスタンスでのみ表示されます。特定の読み取りプール インスタンスのノードまたはすべてのノードのクエリ負荷がフィルタされます。
正規化されたすべてのアクティブ クエリの概要スコアカード: 次のパラメータに基づいて接続の合計数が表示され、すべてのアクティブ クエリの概要が示されます。
- 接続状態別に分類されたアクティブな接続の分布。
- さまざまな待機イベントタイプに基づくアクティブな接続の分布。
- アイドル状態ではないクエリのトランザクション継続時間の分布。
最も実行時間の長いトランザクション: 実行中(
active
状態とidle in transaction
状態)のクエリのうち、実行時間の長いものから順に上位 50 件が表示されます。
正規化されたアクティブ クエリの上位 50 件のリストは、[Query Insights] ダッシュボードに表示できます。
正規化されたアクティブ クエリは、機密データを削除してダイジェストを返します。2 つのクエリで WHERE 句の値以外が同じであれば、ダイジェストは同じです。たとえば、次の 3 つのクエリの例について考えてみましょう。
select * from my_table where id = 1;
select * from my_table where id = 2;
select * from my_table where id = 100;
これらのクエリを正規化したバージョンのダイジェストは次のとおりです。
select * from my_table where id = ?;
異なるセッションで実行されるクエリは、ダッシュボードに別々のエントリとして表示されます。
実行時間の長さが上位のトランザクションを表示する
次の表に、[Query insights] ダッシュボードの [最も実行時間の長いトランザクション] の表の列を示します。
列名 | 説明 |
---|---|
プロセス ID | プロセス ID は、データベース接続の一意の識別子です。 |
ノード ID | ノード ID は、クエリが実行される読み取りプール インスタンス ノードの固有識別子です。 |
クエリ | 正規化された SQL クエリテキスト。 |
ステータス | 接続の現在のステータス。ステータス値は active と idle in transaction です。 |
セッション継続期間 | 現在のセッションの実行時間(秒) |
トランザクションの実行時間 | 現在のトランザクションの実行時間(秒)。 |
クエリの実行時間 | 現在アクティブなクエリの実行時間(秒)。idle in transaction 状態のクエリはアクティブに実行されていないため、クエリの実行時間は 0 です。 |
待機イベントタイプ | クエリ実行中に発生している待機イベントのタイプ。 |
待機イベント | クエリ実行中に発生している待機イベント。 |
データベース | この接続が実行されているデータベースの名前。 |
アプリケーション名 | この接続が実行されているアプリケーションの名前。 |
ユーザー名 | データベースに接続しているデータベース ユーザーの名前。 |
クライアント アドレス | クエリを送信したクライアントの特定の IP アドレス。 |
アクション | トランザクションを終了するためのリンクが含まれています。 |
表示内容は 60 秒ごとに自動的に更新されます。
[データベース] フィールドと [ユーザー] フィールドを使用してフィルタリングすると、ページ上のデータが更新されます。
静的データを分析するには、[自動更新] を無効にして、必要に応じて [最も実行時間の長いトランザクション] テーブルの [フィルタ] フィールドを使用します。
クエリまたはトランザクションを終了する
クエリまたはトランザクションを終了するには、databaseinsights.operationsAdmin
ロールが必要です。詳細については、IAM の基本ロールと事前定義ロールをご覧ください。
トランザクションには複数のクエリを含めることができます。現在アクティブなクエリを特定するには、[最も実行時間の長いトランザクション] テーブルの [クエリ] 列を確認します。
クエリまたはトランザクションを終了するには、次の手順を実施します。
- [最も実行時間の長いトランザクション] テーブルでクエリを選択します。
- 右にスクロールして [アクション] 列に移動します。
- [接続を終了] をクリックします。
[接続を終了] ウィンドウで、[確認] をクリックします。
終了を開始すると、ページが更新されます。終了が失敗した場合は、エラーは表示されず、クエリは [アクティブなクエリ] リストに引き続き表示されます。終了が成功すると、クエリはリストに表示されなくなります。