高価なクエリを特定する

TiDB を使用すると、SQL 実行中にコストのかかるクエリを特定できるため、SQL 実行のパフォーマンスを診断して改善できます。具体的には、 出力 は、実行時間がtidb_expensive_query_time_threshold (デフォルトでは 60 秒) を超えるか、メモリ使用量がtidb_mem_quota_query (デフォルトでは 1 GB) を超えるステートメントに関する情報をtidb サーバー ログ ファイル (デフォルトでは「tidb.log」) に出力します。

ノート:

高価なクエリ ログは、次の点で遅いクエリ ログと異なります出力は、ステートメントがリソース使用量のしきい値 (実行時間またはメモリ使用量) を超えるとすぐに、ステートメント情報を高価なクエリ ログに出力します。一方、TiDB は、ステートメントの実行にスロー クエリ ログにステートメント情報を出力します。

高価なクエリ ログの例

[2020/02/05 15:32:25.096 +08:00] [WARN] [expensivequery.go:167] [expensive_query] [cost_time=60.008338935s] [wait_time=0s] [request_count=1] [total_keys=70] [process_keys=65] [num_cop_tasks=1] [process_avg_time=0s] [process_p90_time=0s] [process_max_time=0s] [process_max_addr=10.0.1.9:20160] [wait_avg_time=0.002s] [wait_p90_time=0.002s] [wait_max_time=0.002s] [wait_max_addr=10.0.1.9:20160] [stats=t:pseudo] [conn_id=60026] [user=root] [database=test] [table_ids="[122]"] [txn_start_ts=414420273735139329] [mem_max="1035 Bytes (1.0107421875 KB)"] [sql="insert into t select sleep(1) from t"]

フィールドの説明

基本フィールド:

  • cost_time : ログが出力されるときのステートメントの実行時間。
  • stats : ステートメントに含まれるテーブルまたはインデックスで使用される統計のバージョン。値がpseudoの場合、利用可能な統計がないことを意味します。この場合、テーブルまたはインデックスを分析する必要があります。
  • table_ids : ステートメントに含まれるテーブルの ID。
  • txn_start_ts : トランザクションの開始タイムスタンプと一意の ID。この値を使用して、トランザクション関連のログを検索できます。
  • sql : SQL ステートメント。

メモリ使用量関連のフィールド:

  • mem_max : ログが印刷されるときのステートメントのメモリ使用量。このフィールドには、メモリ使用量を測定するための 2 種類の単位があります。バイトと、その他の読み取り可能で適応可能な単位 (MB や GB など) です。

ユーザー関連フィールド:

  • user : ステートメントを実行するユーザーの名前。
  • conn_id : 接続 ID (セッション ID)。たとえば、キーワードcon:60026を使用して、セッション ID が60026のログを検索できます。
  • database : ステートメントが実行されるデータベース。

TiKV コプロセッサーのタスク関連フィールド:

  • wait_time : TiKV のステートメントのすべてのコプロセッサー要求の合計待ち時間。 TiKV のコプロセッサは限られた数のスレッドを実行するため、コプロセッサのすべてのスレッドが動作しているときにリクエストがキューに入ることがあります。キュー内のリクエストの処理に時間がかかると、後続のリクエストの待ち時間が長くなります。
  • request_count : ステートメントが送信するコプロセッサー要求の数。
  • total_keys : コプロセッサーがスキャンしたキーの数。
  • processed_keys : コプロセッサーが処理したキーの数。 total_keysと比較して、 processed_keysには古いバージョンの MVCC が含まれていません。 processed_keystotal_keysの大きな違いは、多くの古いバージョンが存在することを示しています。
  • num_cop_tasks : ステートメントが送信するコプロセッサー要求の数。
  • process_avg_time : コプロセッサー・タスクの平均実行時間。
  • process_p90_time : コプロセッサ タスクの P90 実行時間。
  • process_max_time : コプロセッサー・タスクの最大実行時間。
  • process_max_addr : 実行時間が最も長いコプロセッサー・タスクのアドレス。
  • wait_avg_time : コプロセッサー・タスクの平均待ち時間。
  • wait_p90_time : コプロセッサタスクの P90 待ち時間。
  • wait_max_time : コプロセッサー・タスクの最大待ち時間。
  • wait_max_addr : 待ち時間が最も長いコプロセッサー・タスクのアドレス。