このページでは、Query Insights ダッシュボードを使用してパフォーマンスの問題を検出して分析する方法について説明します。
Gemini in Databases アシスタントを使用すると、Cloud SQL for MySQL リソースのモニタリングとトラブルシューティングを行えます。詳細については、Gemini の支援機能によるモニタリングとトラブルシューティングをご覧ください。
はじめに
Query Insights では、Cloud SQL データベースに対するクエリ パフォーマンスの問題を検出、診断、防止できます。直感的なモニタリングをサポートし、パフォーマンスの問題の検出だけでなく根本原因の特定にも役立つ診断情報を提供します。
Query Insights では、アプリケーション レベルでパフォーマンスをモニタリングでき、問題のあるクエリの発生源をモデル、ビュー、コントローラ、ルート、ユーザー、ホストによりアプリケーション スタック全体でトレースできます。Query Insights ツールは、オープン標準と API を使用して、既存のアプリケーション モニタリング(APM)ツールや Google Cloudサービスと統合できます。これにより、お好みのツールを使用してクエリの問題をモニタリングし、トラブルシューティングできます。
Query Insights では、次の手順を行い、Cloud SQL クエリのパフォーマンスを向上させることができます。
Cloud SQL Enterprise Plus エディションの Query Insights
Cloud SQL Enterprise Plus エディションを使用している場合は、Query Insights の追加機能にアクセスして、高度なクエリ パフォーマンス診断を実行できます。Cloud SQL Enterprise Plus エディションの Query Insights では、Query Insights ダッシュボードの標準機能に加えて、次のことができます。
- 集計されたデータベース負荷をクエリ、タグなどの追加項目でフィルタする
- 実行されたすべてのクエリのクエリプランをキャプチャする
- 1 分あたり最大 200 件のクエリプランをサンプリングする
- 最大 1 MB の長いクエリテキストをキャプチャする
- 指標のほぼリアルタイムの更新を取得する(数秒単位)
- 指標の保持期間を 30 日間に延長する
次の表は、Cloud SQL Enterprise エディションの Query Insights と Cloud SQL Enterprise Plus エディションの Query Insights の機能要件と機能を比較したものです。
比較領域 | Cloud SQL Enterprise エディションの Query Insights | Cloud SQL Enterprise Plus エディションの Query Insights |
---|---|---|
サポートされているデータベース バージョン | MySQL 5.7 以降 | MySQL 8.0 以降 |
サポートされているマシンタイプ | すべてのマシンタイプでサポート | 共有コア マシンタイプを使用するインスタンスではサポートされない |
サポートされるリージョン | Cloud SQL のリージョン ロケーション | Cloud SQL Enterprise Plus エディションのリージョン ロケーション |
指標の保持期間 | 7 日間 | 30 日間 |
クエリの長さの上限 | 4,500 バイト | 1 MB |
クエリプランのサンプルの最大数 | 20 | 200 |
Cloud SQL Enterprise Plus エディション インスタンスのプレビュー中に Cloud SQL Enterprise Plus エディションの Query Insights を有効にするには、Cloud SQL Enterprise Plus エディションの Query Insights を有効にするの手順に沿って操作します。
料金
Query Insights に追加料金は発生しません。また、Cloud SQL Enterprise Plus エディションの Query Insights を有効にしても料金は発生しません。Cloud SQL Enterprise Plus エディションの Query Insights はプレビュー版です。
ストレージ要件
Cloud SQL Enterprise エディションの Query Insights は、Cloud SQL インスタンスの保存容量を占有しません。指標は Cloud Monitoring に保存されます。API リクエストについては、Cloud Monitoring の料金をご覧ください。Cloud Monitoring には、追加費用なしで使用できる枠が用意されています。
Cloud SQL Enterprise Plus エディションの Query Insights(プレビュー版)は、Cloud SQL インスタンスにアタッチされているディスクに指標データを保存します。そのため、ストレージの自動増量の設定を有効にしておく必要があります。
7 日間分のデータのストレージ要件は約 45 GB です。30 日間の場合は約 180 GB が必要です。Cloud SQL Enterprise Plus エディションの Query Insights は、最大 130 MB の RAM を使用します。指標は、クエリの完了から 1 分以内に Query Insights で利用できるようになると想定されています。該当するストレージ料金が適用されます。始める前に
Query Insights を使用する前に、次の手順を行います。
- 必要なロールと権限を追加する。
- Cloud Trace API を有効にする。
- Cloud SQL Enterprise Plus エディションの Query Insights を使用している場合は、[ストレージの自動増量を有効にする] がインスタンスで有効になっていることを確認する。
必要なロールと権限
Query Insights を使用するには、必要な Identity and Access Management 権限を持つロールを付与するか、必要な権限を持つユーザー アカウントを指定する必要があります。
ロールの付与の詳細については、アクセスの管理をご覧ください。
Query Insights ダッシュボードで過去のクエリ実行データにアクセスするために必要な権限を取得するには、Cloud SQL インスタンスをホストするプロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
- データベース分析情報のモニタリング閲覧者(
roles/databaseinsights.monitoringViewer
) - Cloud SQL 閲覧者(
roles/cloudsql.viewer
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、Query Insights ダッシュボードで過去のクエリ実行データにアクセスするために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
Query Insights ダッシュボードで過去のクエリ実行データにアクセスするには、次の権限が必要です。
-
databaseinsights.aggregatedStats.query
-
databaseinsights.timeSeries.query
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
たとえば、データベース分析情報で、データベース分析情報閲覧者(roles/databaseinsights.viewer
)の事前定義ロールを付与するよう管理者に依頼し、Cloud SQL で、次のいずれかの事前定義ロールを付与するよう管理者に依頼できます。
- Cloud SQL 編集者(
roles/cloudsql.editor
) - Cloud SQL 管理者(
roles/cloudsql.admin
)
Trace API を有効にする
クエリプランとそのエンドツーエンドのビューを表示するには、 Google Cloud プロジェクトで Trace API を有効にする必要があります。この設定により、Google Cloud プロジェクトは認証済みのソースからトレースデータを追加料金なしで受信できます。このデータは、インスタンスのパフォーマンスの問題を検出して診断する際に役立ちます。
Trace API が有効になっていることを確認する手順は、次のとおりです。
- Google Cloud コンソールから [API とサービス] に移動します。
- [有効な API とサービス] をクリックします。
- 検索バーに「
Trace API
」と入力します。 - [API が有効です] と表示されている場合、この API は有効になっており、操作は不要です。それ以外の場合は、[有効にする] をクリックします。
ストレージの自動増量を有効にする
Cloud SQL Enterprise Plus エディションの Query Insights(プレビュー版)を使用している場合は、ストレージの自動増量を有効にするインスタンス設定が有効になっていることを確認してください。デフォルトでは、Cloud SQL インスタンスでこのオプションが有効になっています。以前にこのインスタンス設定を無効にした場合、Cloud SQL Enterprise Plus エディションの Query Insights を有効にするには、まずストレージの自動増量を再度有効にしてください。ストレージの自動増量をオフにして Cloud SQL Enterprise Plus エディションの Query Insights を有効にすることはできません。
Query Insights を有効にする
Cloud SQL ダッシュボードにアクセスできるユーザーは、Query Insights の指標にアクセスできます。インスタンスを更新する権限がある場合は、Query Insights を有効にできます。Cloud SQL インスタンスに必要な権限の一覧については、Cloud SQL プロジェクトのアクセス制御をご覧ください。これらの権限がなく、インスタンスで Query Insights を有効にする場合は、管理者にお問い合わせください。
インスタンスで Query Insights を有効にする
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [構成] タイルで、[構成の編集] をクリックします。
- [インスタンスのカスタマイズ] セクションで、[Query Insights] を開きます。
- [Query Insights を有効にする] チェックボックスを選択します。
- 省略可。以下の Query Insights 追加機能を 1 つ以上選択します。
- [保存] をクリックします。
アクティブ クエリ分析
デフォルト: false
アクティブに実行されているクエリの詳細を確認して、必要に応じて長時間実行クエリを終了できます。詳細については、アクティブなクエリをモニタリングするをご覧ください。この機能はプレビュー版です。
インデックス アドバイザーを有効にする
デフォルト: false
インデックス アドバイザーは、クエリ処理を高速化するためのインデックスの推奨事項を提供します。インデックス アドバイザーを有効にすると、インスタンスの再起動が必要になります。詳細については、インデックス アドバイザーの概要とインデックス アドバイザーを使用するをご覧ください。この機能はプレビュー版です。
クライアント IP アドレスを保存する
デフォルト: false
クエリの送信元であるクライアント IP アドレスを保存します。これにより、そのデータをグループ化して、そのデータに対して指標を実行できます。クエリは複数のホストから送信されます。クライアント IP アドレスからのクエリのグラフを確認すると、問題の原因を特定しやすくなります。
アプリケーション タグを保存する
デフォルト: false
アプリケーション タグを保存します。このタグは、リクエストを行っている API とモデル ビュー コントローラ(MVC)のルート決定や、指標を実行するためのデータのグループ化に役立ちます。このオプションでは、sqlcommenter オープンソース オブジェクト リレーショナル マッピング(ORM)自動計測ライブラリを使用して、特定のタグセットでクエリにコメントを追加する必要があります。この情報により、Query Insights が問題の原因および問題の原因となっている MVC を特定できます。アプリケーション パスは、アプリケーションのモニタリングに役立ちます。
クエリの長さをカスタマイズする
デフォルト: 1024
クエリ長の上限を 256~4,500 バイトに設定します。分析クエリの場合はより長いほうが便利ですが、必要なメモリ量が増えます。クエリ長を変更するには、インスタンスを再起動する必要があります。長さの上限を超えるクエリにもタグを追加できます。
最大サンプリング レートを設定する
デフォルト: 5
最大サンプリング レートを設定します。サンプリング レートとは、インスタンス上のすべてのデータベースで 1 分間にキャプチャされる実行済みクエリプランのサンプル数です。この値を、0(サンプリングを無効にする場合)~20 の範囲で変更します。サンプリング レートを上げると、通常は得られるデータポイントの数が増えますが、パフォーマンスのオーバーヘッドが増加する可能性があります。
複数のインスタンスで Query Insights を有効にする
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- 任意の行にある [その他の操作] メニューをクリックします。
- [Query Insights を有効にする] を選択します。
- ダイアログで、[複数のインスタンスで Query Insights を有効にする] チェックボックスをオンにします。
- [有効にする] をクリックします。
- 続くダイアログで、Query Insights を有効にするインスタンスを選択します。
- [Query Insights を有効にする] をクリックします。
gcloud
を使用して Cloud SQL インスタンスの Query Insights を有効にするには、次のように --insights-config-query-insights-enabled
フラグを指定して gcloud sql instances patch
を実行します。実行する前に INSTANCE_ID をインスタンスの ID に置き換えてください。
gcloud sql instances patchINSTANCE_ID \ --insights-config-query-insights-enabled
また、次のオプション フラグを 1 つ以上使用します。
--insights-config-record-client-address
クエリの送信元であるクライアント IP アドレスを保存します。これにより、そのデータをグループ化して、そのデータに対して指標を実行できます。クエリは複数のホストから送信されます。クライアント IP アドレスからのクエリのグラフを確認すると、問題の原因を特定しやすくなります。
--insights-config-record-application-tags
アプリケーション タグを保存します。このタグは、リクエストを行っている API とモデル ビュー コントローラ(MVC)のルート決定や、指標を実行するためのデータのグループ化に役立ちます。このオプションでは、特定のタグセットを使用してクエリにコメントする必要があります。これを行うには、sqlcommenter オープンソース オブジェクト リレーショナル マッピング(ORM)自動計測ライブラリを使用します。この情報は、Query Insights で問題の原因を特定する際に役立ちます。また、問題の原因となっている MVC も把握できます。アプリケーション パスは、アプリケーションのモニタリングに役立ちます。
--insights-config-query-string-length
デフォルトのクエリ長の上限を 256~4,500 バイトに設定します。デフォルトのクエリ長は 1,024 バイトです。分析クエリの場合はより長いほうが便利ですが、必要なメモリ量が増えます。クエリ長を変更するには、インスタンスを再起動する必要があります。長さの上限を超えるクエリにもタグを追加できます。
--query_plans_per_minute
インスタンス上のすべてのデータベースで、実行されるクエリプランのサンプルがデフォルトで 1 分間に最大 5 回キャプチャされます。この値を、0(サンプリングを無効にする場合)~20 の範囲で変更します。サンプリング レートを上げると、通常は得られるデータポイントの数が増えますが、パフォーマンスのオーバーヘッドが増加する可能性があります。
次のように置き換えます。
- INSIGHTS_CONFIG_QUERY_STRING_LENGTH: 格納されるクエリ文字列の長さ(バイト単位)。
- API_TIER_STRING: インスタンスに使用するカスタム インスタンス構成。
- REGION: インスタンスのリージョン。
gcloud sql instances patchINSTANCE_ID \ --insights-config-query-insights-enabled \ --insights-config-query-string-length=INSIGHTS_CONFIG_QUERY_STRING_LENGTH \ --query_plans_per_minute=QUERY_PLANS_PER_MINUTE \ --insights-config-record-application-tags \ --insights-config-record-client-address \ --tier=API_TIER_STRING \ --region=REGION
REST API を使用して Cloud SQL インスタンスの Query Insights を有効にするには、insightsConfig
設定で instances.patch
メソッドを呼び出します。
リクエストのデータを使用する前に、次のように置き換えます。
- project-id: プロジェクト ID。
- instance-id: インスタンス ID。
HTTP メソッドと URL:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id
リクエストの本文(JSON):
{ "settings" : { "insightsConfig" : { "queryInsightsEnabled" : true } } }
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id "
PowerShell(Windows)
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id " | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2021-01-28T22:43:40.009Z", "operationType": "UPDATE", "name": "operation-id ", "targetId": "instance-id ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ", "targetProject": "project-id " }
Terraform を使用して Cloud SQL インスタンスの Query Insights を有効にするには、query_insights_enabled
フラグを true
に設定します。
また、次のオプション フラグを 1 つ以上使用することもできます。
-
query_string_length
: デフォルトは1024
で、256
~4500
バイトの範囲の値に構成できます。 record_application_tags
: クエリからアプリケーション タグを記録する場合は、値をtrue
に設定します。record_client_address
: クライアント IP アドレスを記録する場合は、値をtrue
に設定します。query_plans_per_minute
: デフォルトは5
です。5
~20
の値に構成できます。
次に例を示します。
resource "google_sql_database_instance" "INSTANCE_NAME " { name = "INSTANCE_NAME " database_version = "MYSQL_VERSION " region = "REGION " root_password = "PASSWORD " deletion_protection = false # set to true to prevent destruction of the resource settings { tier = "DB_TIER " insights_config { query_insights_enabled = true query_string_length = 2048 # Optional record_application_tags = true # Optional record_client_address = true # Optional query_plans_per_minute = 10 # Optional } } }
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=
PROJECT_ID Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir
DIRECTORY && cdDIRECTORY && touch main.tf -
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
指標は、クエリの完了から数分以内に Query Insights で利用できるようになると想定されています。Cloud Monitoring のデータ保持ポリシーを確認します。
Query Insights のトレースは Cloud Trace に保存されます。Cloud Trace のデータ保持ポリシーを確認します。
Cloud SQL Enterprise Plus エディションの Query Insights を有効にする
Cloud SQL インスタンスで Cloud SQL Enterprise Plus エディションの Query Insights を有効にできるのは、Google Cloud コンソールを使用する場合のみです。
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [編集] をクリックします。
- [ストレージ] セクションで、[ストレージの自動増量を有効にする] チェックボックスがオンになっていることを確認します。
- [インスタンスのカスタマイズ] セクションで、[Query Insights] を開きます。
- [Enterprise Plus の機能を有効にする] チェックボックスをオンにします。
Cloud SQL Enterprise Plus エディションの Query Insights を有効にすると、次のフィールドを更新できます。
クエリの長さをカスタマイズする: クエリの長さの上限(バイト単位)を指定します。
1
~1048576
の数値を指定できます。指定された上限を超えるクエリ文字列は、表示時に切り捨てられます。クエリ長の上限を上げると、必要なメモリが増えます。デフォルト値は1024
バイト(1 KB)です。最大サンプリング レートを設定する: データベースの負荷に応じて、クエリの最大サンプリング レートを設定できます。デフォルトでは、最大サンプリング レートは、インスタンス上のすべてのデータベースで 1 分あたり 5 個のクエリプラン サンプルに設定されています。最大数を 200 に増やしてデータポイントを増やすこともできますが、数を増やすとデータベースの負荷も増加する可能性があります。
[保存] をクリックします。
Query Insights ダッシュボードを表示する
Query Insights ダッシュボードには、選択された要素に基づいて、クエリ負荷が表示されます。クエリ負荷は、選択された時間範囲内のインスタンス内のすべてのクエリの合計作業量の測定値です。ダッシュボードには、クエリの負荷を確認するための一連のフィルタが用意されています。
Query Insights ダッシュボードを開くには、次の手順を行います。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- 左側のナビゲーション パネルで [Query insights] タブを選択するか、[Query Insights に移動すると、クエリとパフォーマンスに関する詳細情報を確認できます] リンクをクリックします。
Query Insights ダッシュボードが開きます。インスタンスに関する次の情報が表示されます。

- データベース: 特定のデータベースまたはすべてのデータベースのクエリ負荷をフィルタします。
- ユーザー: 特定のユーザー アカウントからのクエリ負荷をフィルタします。
- クライアント アドレス: 特定の IP アドレスからのクエリ負荷をフィルタします。
- 期間: 1 時間、6 時間、1 日、7 日、30 日、カスタム範囲など、時間範囲でクエリ負荷をフィルタします。
- データベース負荷グラフ: フィルタされたデータに基づき、クエリ負荷のグラフを表示します。
- CPU 容量、CPU と CPU 待機、IO 待機、ロック待機: 選択したオプションに基づいて負荷がフィルタされます。これらのフィルタの詳細については、上位のクエリのデータベース負荷を表示するをご覧ください。
- クエリとタグ: 選択したクエリまたは選択した SQL クエリタグのいずれかでクエリ負荷をフィルタします。データベース負荷のフィルタリングをご覧ください。
すべてのクエリのデータベース負荷を表示する
データベースのクエリ負荷は、選択したデータベースで実行されたクエリの作業量の経時的な測定結果(CPU 秒単位)です。実行中の各クエリは、CPU リソース、IO リソース、またはロックリソースを使用または待機しています。データベースのクエリ負荷は、実時間に対する、指定の時間枠内で完了したすべてのクエリで要した時間の比率です。
トップレベルの Query Insights ダッシュボードには、[データベース負荷 - すべての上位クエリ] グラフが表示されます。ダッシュボードのプルダウン メニューでは、特定のデータベース、ユーザー、またはクライアント アドレスのグラフがフィルタされます。

グラフの色付きの線で、クエリ負荷をカテゴリ別に表示します。
- CPU 容量: インスタンスで利用可能な CPU の数。
- CPU と CPU 待機: 実時間に対する、アクティブな状態のクエリで要した時間の比率です。IO 待機とロック待機は、アクティブ状態のクエリをブロックしません。この指標は、クエリが CPU を使用している可能性があることを示します。また、他のプロセスが CPU を使用しているときに Linux スケジューラがクエリを実行しているサーバー プロセスをスケジューリングするのをクエリが待機している可能性もあります。
- IO 待機: 実時間に対する、IO を待機していたクエリで要した時間の比率です。IO 待機には、読み取り IO 待機と書き込み IO 待機が含まれます。 IO 待機に関する情報の内訳が必要な場合は、Cloud Monitoring で確認できます。詳細については、Cloud SQL の指標をご覧ください。
- ロック待機: 実時間に対する、ロックを待機していたクエリで要した時間の比率です。通常のロック待機の他に、LwLock 待機と BufferPin ロック待機が含まれます。ロック待機の情報の詳細を確認するには、Cloud Monitoring を使用します。詳細については、Cloud SQL の指標をご覧ください。
グラフの色付きの線で、データベースごとの負荷を実行時間別に表示します。グラフを確認し、フィルタ オプションを使用して以下の質問を検討してください。
- クエリ負荷は高いですか?グラフは時間の経過にともなって急上昇または上昇していますか?負荷が高くない場合は、クエリに問題はありません。
- 高い負荷がどのくらい続いていますか?その値はいまだけ高くなっていますか。それとも、長い間、高くなっていますか?範囲セレクタを使用して、さまざまな期間を選択して、問題が発生した期間を特定します。ズームインすると、クエリ負荷の急増が観測される時間枠が拡大表示されます。ズームアウトすると、最大 1 週間のタイムラインが表示されます。
- 高負荷の原因は何ですか?CPU 容量、CPU と CPU 待機、ロック待機、IO 待機を確認するオプションを選択できます。これらの各オプションのグラフは色が異なるため、負荷が最も高いものを見つけることができます。グラフの濃い青色の線は、システムの最大 CPU 容量を示しています。これにより、クエリ負荷をシステムの最大 CPU 容量と比較できます。この比較を行うことで、インスタンスの CPU リソースが不足しているかどうかを把握できます。
- どのデータベースで負荷が発生していますか?[データベース] プルダウン メニューからデータベースを選択して、負荷が最も高いデータベースを特定します。
- 特定のユーザーまたは IP アドレスが高負荷の原因となっていますか?プルダウン メニューから別のユーザーとアドレスを選択して、高負荷の原因を特定します。
データベース負荷のフィルタリング
クエリまたはタグでデータベース負荷をフィルタリングできます。Cloud SQL Enterprise Plus エディションの Query Insights を使用している場合は、データベース負荷グラフをカスタマイズして、次のいずれかの項目を使用して表示データを分類できます。- すべてのクエリ
データベース
ユーザー
タグ
クライアント アドレス
データベース負荷グラフをカスタマイズするには、[実行時間別のデータベース負荷] プルダウンから項目を選択します。
データベース負荷の主な要因を表示する
データベースの負荷に最も影響を与えている項目を表示するには、[データベースの負荷別の上位項目] テーブルを使用します。[データベースの負荷別の上位項目] テーブルには、[実行時間別のデータベース負荷] グラフのプルダウンで選択した期間と項目の上位項目が表示されます。期間または項目を変更すると、別の項目または期間の上位の主要因を確認できます。
[データベースの負荷別の上位項目] テーブルで、次のタブを選択できます。
タブ | 説明 |
---|---|
クエリ | このテーブルには、合計実行時間が上位の正規化されたクエリが表示されます。クエリごとに列に表示されるデータは次のとおりです。
|
データベース | このテーブルには、選択した期間中に実行されたすべてのクエリで負荷増加の要因となった上位のデータベースのリストが表示されます。
|
ユーザー | このテーブルには、実行されたすべてのクエリについて、選択した期間の上位ユーザーのリストが表示されます。
|
タグ | タグの詳細については、クエリタグでフィルタリングするをご覧ください。 |
クライアント アドレス | このテーブルには、実行されたすべてのクエリについて、選択した期間の上位ユーザーのリストが表示されます。
|
クエリでフィルタリングする
[クエリ] テーブルでは、クエリ負荷が最も大きいクエリの概要を確認できます。このテーブルには、Query Insights ダッシュボードで選択された時間枠とオプションに対応する、正規化されたすべてのクエリが表示されます。選択した時間枠内の合計実行時間でクエリが並べ替えられます。

テーブルを並べ替えるには、[クエリのフィルタリング] から列見出しまたはプロパティを選択します。テーブルには以下のプロパティが表示されます。
- クエリ: 正規化されたクエリ文字列。Query Insights では、デフォルトでクエリ文字列の 1,024 文字のみが表示されます。
UTILITY COMMAND
というラベルの付いたクエリには通常、BEGIN
、COMMIT
、EXPLAIN
コマンド、またはラッパー コマンドが含まれます。 - データベース: クエリが実行されたデータベース。
- 負荷(合計時間別)/ 負荷(CPU 別)/ 負荷(IO 待機別)/ 負荷(ロック待機別): 特定のクエリをフィルタして最大の負荷を見つけるオプションです。
- クエリ別の負荷の割合(%): 個々のクエリによる負荷の割合。
- 平均実行時間(ミリ秒): クエリの平均実行時間。
- 呼び出された回数: アプリケーションがクエリを呼び出した回数。
- 返された平均行数: クエリに対して返された行数の平均。
- 平均スキャン行数: クエリでスキャンされた行数の平均。
Query Insights は、正規化されたクエリのみを保存し、表示します。
デフォルトでは、Query Insights は IP アドレスやタグ情報を収集しません。この情報を収集するように Query Insights を設定できます。また、必要に応じて収集を無効にすることもできます。
クエリプランのトレースでは、定数値が収集または保存されず、定数として表示される PII 情報が削除されます。
Query Insights は正規化されたクエリを表示します。つまり、リテラル定数値が ?
に置き替わります。次の例では、名前定数が削除され、?
に置換されています。
UPDATE "demo_customer" SET "customer_id" = ?::uuid, "name" = ?, "address" = ?, "rating" = ?, "balance" = ?, "current_city" = ?, "current_location" = ? WHERE "demo_customer"."id" = ?
クエリタグでフィルタリングする
アプリケーションのトラブルシューティングを行うには、最初に SQL クエリにタグを追加する必要があります。クエリ負荷タグは、選択したタグのクエリ負荷の内訳の時間変化を示します。
Query Insights は、アプリケーション中心のモニタリングを提供して、ORM を使用して構築されたアプリケーションのパフォーマンスの問題を診断できるようにします。アプリケーション スタック全体の担当者である場合、Query Insights で、アプリケーションの視点からクエリをモニタリングできます。クエリのタグ付けは、ビジネス ロジックやマイクロサービスなど、より高レベルなコンストラクトで問題を見つけるのに役立ちます。
たとえば、支払いタグ、在庫タグ、ビジネス分析タグ、出荷タグなどのように、ビジネス ロジックでクエリにタグを付けることができます。このようにすると、さまざまなビジネス ロジックごとに作成されるクエリ負荷を特定できます。たとえば、午後 1 時にビジネス分析タグが急増している、過去 1 週間にわたって決済サービスが予想外の増加傾向を見せている、などの予期しないイベントに気づく可能性があります。
タグのデータベース負荷を計算するために、Query Insights は選択したタグを使用するすべてのクエリにかかる時間を使用します。このツールでは、実時間を使用して 1 分間隔で完了時間を計算できます。
Query Insights ダッシュボードで、タグテーブルを表示するには、[タグ] を選択します。タグが合計負荷を合計時間で割った値で並べ替えられます。

テーブルを並べ替えるには、[タグのフィルタリング] からプロパティを選択するか、列見出しをクリックします。テーブルには以下のプロパティが表示されます。
- アクション、コントローラ、フレームワーク、ルート、アプリケーション、DB ドライバ: クエリに追加した各プロパティが列として表示されます。タグでフィルタリングする場合は、これらのプロパティのうち少なくとも 1 つを追加する必要があります。
- 負荷(合計時間別)/ 負荷(CPU 別)/ 負荷(IO 待機別)/ 負荷(ロック待機別): 特定のクエリをフィルタリングして、各オプションの最大負荷を見つけるオプション。
- 平均実行時間(ミリ秒): クエリの平均実行時間。
- 返された平均行数: クエリに対して返された行数の平均。
- 平均スキャン行数: クエリでスキャンされた行数の平均。
- 呼び出された回数: アプリケーションがクエリを呼び出した回数。
- データベース: クエリが実行されたデータベース。
特定のクエリまたはタグの調査
クエリまたはタグが問題の根本原因であるかどうかを確認するには、[クエリ] タブまたは [タグ] タブで次の操作を行います。
- リストを降順で並べ替えるには、[負荷(合計実行時間別)] ヘッダーをクリックします。
- リストの一番上にあるクエリまたはタグをクリックします。このクエリまたはタグは、負荷が最も高く、他のインスタンスよりも時間がかかっています。
選択したクエリまたはタグの詳細を示すダッシュボードが開きます。
特定のクエリ負荷の調査
選択したクエリのダッシュボードが次のように表示されます。

[データベースの負荷 - 特定のクエリ] グラフは、正規化クエリが選択したクエリで時間の経過に伴って行った作業量(CPU 秒)の測定結果を示します。実時間の 1 分間隔で完了した正規化クエリで要した時間を使用して、負荷を計算します。テーブルの上部には、集計と PII の理由からリテラルが削除された状態で、正規化されたクエリの最初の 1,024 文字が表示されます。

全クエリのグラフと同様に、データベース、ユーザー、クライアント アドレスで、特定のクエリの負荷をフィルタリングできます。クエリ負荷は、CPU 容量、CPU と CPU 待機、IO 待機、ロック待機に分割されます。
タグ付けされた特定のクエリ負荷の調査
選択したタグのダッシュボードが次のように表示されます。たとえば、マイクロサービスの支払いからのすべてのクエリに payment
というタグを付けている場合、payment
タグを表示することで、急上昇しているクエリの負荷を確認できます。

[データベースの負荷 - 特定のタグ] グラフは、選択したタグに一致するクエリが選択したデータベースで行った作業量(CPU 秒)の測定結果を時系列で示します。全クエリのグラフと同様に、データベース、ユーザー、クライアント アドレスで、特定のタグの負荷をフィルタリングできます。
サンプリングされたクエリプランでのオペレーションの調査
クエリプランは、クエリのサンプルを取得し、それを個々のオペレーションに分割します。クエリ内の各オペレーションが説明され、分析されます。
MySQL 5.7 では、EXPLAIN ビューを使用して推定クエリプランが提供され、MySQL 8.0 以降のバージョンでは EXPLAIN ANALYZE ビューを使用して実行されたクエリプランが提供されます。推定クエリプランでは、クエリの推定実行時間が示されますが、実行されたクエリプランでは、特定のクエリの各実行ステップのリアルタイム情報が示されます。
MySQL 5.7 のクエリプランは、EXPLAIN ステートメントがサポートする次のクエリでサポートされています。
- 単一テーブルの場合: INSERT、SELECT、UPDATE、DELETE
- 複数テーブルの場合: SELECT、UPDATE、DELETE
MySQL 8.0 以降では、EXPLAIN ANALYZE がサポートするすべてのクエリでクエリプランを生成できます。このツールは、単一テーブルと複数テーブルの SELECT クエリに MySQL が費やした時間を示します。マルチテーブルのデータ操作言語(DML)のクエリプランの生成は EXPLAIN ANALYZE がサポートしていないため、Cloud SQL でサポートされていません。
サンプル クエリプランには、正規化されたクエリに関連するクエリプラン サンプルの EXPLAIN ANALYZE ビューが表示されます。これらは実行されたクエリプランであり、クエリプラン内の各オペレーションにかかったアクティブ時間の内訳を提供します。
[クエリプランのサンプル] グラフには、特定の時間に実行されているすべてのクエリプランと、各プランの実行にかかった時間が表示されます。クエリプランのサンプルが 1 分あたりにキャプチャされるペースを変更できます。Query Insights を有効にするをご覧ください。

デフォルトでは、クエリプランのサンプルのグラフに表示されているとおり、右側のパネルには長時間かかるサンプル クエリプランの詳細が表示されます。別のサンプル クエリプランの詳細を表示するには、グラフで関連する円をクリックします。詳細が開き、クエリプランのすべてのオペレーションのモデルが表示されます。オペレーションごとに、レイテンシ、返される行、そのオペレーションの費用が表示されます。オペレーションを選択すると、共有ヒットブロック、スキーマのタイプ、ループ、プラン行などの詳細が表示されます。

以下の質問を確認して、問題を絞り込んでみてください。
- リソースの消費量とは何ですか?
- 他のクエリとどのように関係していますか?
- 消費は時間とともに変化していますか?
レイテンシの調査
レイテンシとは、正規化されたクエリの実行に要した実時間です。クエリまたはタグのレイテンシを調べるには、レイテンシ グラフを使用します。レイテンシ ダッシュボードには、外れ値の動作を見つけるために 50 番目、95 番目、および 99 番目のパーセンタイル・レイテンシが表示されます。
以下の図は、CPU 容量、CPU と CPU 待機、IO 待機、ロック待機のフィルタを選択した、特定のクエリの 50 パーセンタイルでのデータベース負荷のグラフを示します。

並列クエリでは、クエリの一部を実行するのに複数のコアが使用されるためクエリ負荷が高くなる可能性がありますが、レイテンシは実時間で測定されます。
以下の質問を確認して、問題を絞り込んでみてください。
- 高負荷の原因は何ですか?CPU 容量、CPU と CPU 待機、I/O 待機、ロック待機を確認するオプションを選択します。
- 高い負荷がどのくらい続いていますか?高いのは今だけですか?それとも、長い間、高いですか?期間を変更して、負荷が悪化しはじめた日時を見つけます。
- レイテンシの急増はありますか?時間枠を変更して、正規化されたクエリの履歴レイテンシを調査します。
問題の原因の特定
負荷が最大の領域と時間を見つけたら、トレースを使用してさらに掘り下げて、問題の原因を特定します。
モデル、ビュー、コントローラ、ルート、ホスト、ユーザーなど、問題の原因を特定できるように、Query Insights では、コンテキストに応じたエンドツーエンドのアプリケーション トレース ビューが表示されます。特定のリクエストのデータベース レイヤで何が起こっているかを理解し、モデル、ビュー、コントローラ、ルートによって問題のあるクエリのソースを見つけることができます。
OpenCensus または OpenTelemetry を有効にすると、opencensus スパンの情報が SQL コメント内のタグ情報とともにデータベースに送信されます。アプリケーションから Cloud Logging に送信されたトレースは、データベース クエリプラン トレースにリンクされ、問題の原因特定に役立ちます。
[クエリの例] 画面の [エンドツーエンド] タブをクリックすると、コンテキスト内トレースが表示されます。
![[エンドツーエンド] でタグを選択すると、そのタグに関する特定の情報が表示されます。[サマリー] には、そのタグの各オペレーションの RPC と合計時間(ミリ秒)が表示されます。](https://cloud-dot-devsite-v2-prod.appspot.com/sql/images/m-end-to-end.png?hl=ja)
問題を起こしているクライアントとユーザーを特定するには、トップ クライアント アドレスとトップユーザーのテーブルを使用して、負荷が最大のものを探します。ユーザーまたは IP アドレスをフィルタに追加して、特定のユーザーまたはクライアント アドレスをさらに分析できます。テーブルの詳細には、クエリ負荷の割合、平均実行時間(ミリ秒)、呼び出し時間が含まれます。

Cloud Trace を使用して、クエリプランの各ステップをエンドツーエンドでトレースして確認できます。Query Insights ダッシュボードで [Trace で表示] のリンクをクリックして、Cloud Trace ツールを開きます。トレースグラフには、選択した期間に実行されたすべてのトレースが表示されます。

詳細については、トレースの検索と表示をご覧ください。
SQL クエリへのタグの追加
SQL クエリにタグを追加すると、アプリケーションのトラブルシューティングが簡単になります。sqlcommenter を使用すると、自動または手動で SQL クエリにタグを追加できます。
ORM での sqlcommenter の使用
SQL クエリを直接記述する代わりに ORM を使用すると、パフォーマンスの問題を引き起こすアプリケーション コードが見つからない可能性があります。また、アプリケーション コードによるクエリのパフォーマンスへの影響の分析に支障をきたすことがあります。この問題に対処するために、Query Insights では sqlcommenter というオープンソース ライブラリが用意されています。このライブラリは、ORM ツールを使用するデベロッパーと管理者が、パフォーマンスの問題を引き起こしているアプリケーション コードを検出するのに役立ちます。
ORM と sqlcommenter を併用している場合、タグは自動的に作成されます。アプリケーションでコードの追加や変更を行う必要はありません。
sqlcommenter はアプリケーション サーバーにインストールできます。計測ライブラリを使用すると、MVC フレームワークに関連するアプリケーション情報を、SQL コメントとしてクエリとともにデータベースに伝播できます。データベースはこれらのタグを取得し、正規化されたクエリによって集計される統計とは無関係に、タグによる統計の記録と集計を開始します。Query Insights では、クエリ負荷を引き起こしているアプリケーションを把握し、パフォーマンスの問題を引き起こしているアプリケーション コードを特定できるように、タグが表示されます。
SQL データベース ログの結果を調べると、次のように表示されます。
SELECT * from USERS /action='run+this', controller='foo%3', traceparent='00-01', tracestate='rojo%2'/
サポートされるタグには、コントローラ名、ルート、フレームワーク、アクションが含まれます。
sqlcommenter の ORM ツールセットは、次のプログラミング言語に対応しています。
Python |
|
Java |
|
Ruby |
|
Node.js |
|
sqlcommenter の詳細と、ORM フレームワークで sqlcommenter を使用する方法については、sqlcommenter のドキュメントをご覧ください。
sqlcommenter を使用してタグを追加する
ORM を使用していない場合は、SQL クエリに対して正しい SQL コメント形式で、sqlcommenter のタグまたはコメントを手動で追加する必要があります。また、各 SQL ステートメントに、シリアル化された Key-Value ペアを含むコメントを追加する必要があります。次のキーの少なくとも 1 つを使用します。
action=''
controller=''
framework=''
route=''
application=''
db driver=''
Query Insights は、他のすべてのキーを無視します。
Query Insights を無効にする
Google Cloud コンソールを使用して Cloud SQL インスタンスの Query Insights を無効にするには、次の手順を行います。
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [構成] タイルで、[構成の編集] をクリックします。
- 構成オプションのセクションで [Query Insights] を開きます。
- [クエリ分析情報の有効化] チェックボックスをオフにします。
- [保存] をクリックします。
gcloud
を使用して Cloud SQL インスタンスの Query Insights を無効にするには、次のように --no-insights-config-query-insights-enabled
フラグを指定して gcloud sql instances patch
を実行します。実行する前に INSTANCE_ID をインスタンスの ID に置き換えてください。
gcloud sql instances patchINSTANCE_ID
--no-insights-config-query-insights-enabled
REST API を使用して Cloud SQL インスタンスの Query Insights を無効にするには、次のように queryInsightsEnabled
を false
に設定して instances.patch
メソッドを呼び出します。
リクエストのデータを使用する前に、次のように置き換えます。
- project-id: プロジェクト ID。
- instance-id: インスタンス ID。
HTTP メソッドと URL:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id
リクエストの本文(JSON):
{ "settings" : { "insightsConfig" : { "queryInsightsEnabled" : false } } }
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id "
PowerShell(Windows)
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id " | Select-Object -Expand Content
次のような JSON レスポンスが返されます。
{ "kind": "sql#operation", "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /instances/instance-id ", "status": "PENDING", "user": "user@example.com", "insertTime": "2021-01-28T22:43:40.009Z", "operationType": "UPDATE", "name": "operation-id ", "targetId": "instance-id ", "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id /operations/operation-id ", "targetProject": "project-id " }
Cloud SQL Enterprise Plus エディションの Query Insights を無効にする
Cloud SQL Enterprise Plus エディションの Query Insights を無効にするには、次の操作を行います。
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [編集] をクリックします。
- [インスタンスのカスタマイズ] セクションで、[Query Insights] を開きます。
- [Enterprise Plus の機能を有効にする] チェックボックスをオフにします。
- [保存] をクリックします。
次のステップ
- リリースについてのブログ: デベロッパー向けのデータベースのオブザーバビリティ: Cloud SQL Insights のご紹介
- Google Cloud の指標を確認する
- ブログ: Cloud SQL Insights でクエリ パフォーマンスのトラブルシューティング スキルが向上
- 動画: Cloud SQL Insights の導入
- ポッドキャスト: Cloud SQL Insights
- Insights の Codelab
- CPU の高使用率を最適化する
- メモリの高使用率を最適化する
- ブログ: Sqlcommenter のご紹介: オープンソース ORM の自動計測ライブラリ
- ブログ: Sqlcommenter を使用してクエリのタグ付けを有効にする