Skip to main content
QueryRunner テーブルに挿入されたレコードは、エンジンが実行するクエリを表します。 このエンジンは、非同期クエリ実行、生成されたクエリのバッチ実行、 リモートクラスターへのクエリの送信、ベンチマーク、ファジング、シャドートラフィックを用いたテストに使用できます。

テーブルの作成

テーブルは、許可されたカラムの一部 (querydatabasesettings) を含めて作成する必要があります。 カラム query は必須で、その他のカラムは任意です。

エンジン設定

詳細

このテーブルで実行できるのは INSERT クエリのみです。 クエリは “fire and forget” モードで実行されます。つまり、例外が発生しても再試行は行われず、 SELECT クエリの結果は破棄されます (結果を残す唯一の方法は INSERT SELECT です) 。 各クエリが成功したかどうかは system.query_log テーブルで確認できます。この エンジンによって開始されたクエリには、開始元のサーバーで is_internal = 1 が設定されます。 キューに入ったクエリはメモリ内に保持されるため、サーバーを再起動すると失われます。サーバーのシャットダウン時 (またはテーブルに対する DROP/DETACH 時) には、まだ開始されていないクエリは破棄されます。すでに 実行中のクエリのうち、クラスターに送出されるものはキャンセルされ、ローカルで実行されているものは完了するまで 待機されます。 実行対象のクエリ自体が INSERT の場合、そのデータはインラインで指定されている必要があります。つまり INSERT ... VALUES (...)INSERT ... SELECT ...、またはクエリテキスト内にデータを含む INSERT ... FORMAT ... です。データを 別個のストリームから受け取ることを前提とする INSERT はサポートされていません。

ローカルモードとSQL SECURITY

cluster 設定がない場合、クエリはローカルサーバーで実行されます。 どのユーザーとして実行されるかは、SQL SECURITY 句で決まります。
  • INVOKER (デフォルト) : クエリは、INSERT を実行したユーザーの権限で実行されます。
  • DEFINER: クエリは、指定された DEFINER ユーザーの権限で実行されます。挿入されるクエリは任意の内容になり得るため、このようなテーブルに対する INSERT を許可すると、definer のすべての権限を委譲することになります。
  • NONE: クエリは、ユーザーなしで完全なアクセス権限を持って実行されます。テーブルの作成時に ALLOW_SQL_SECURITY_NONE 権限が必要です。

クラスターモード

cluster 設定を指定すると、クエリは指定したクラスターに送信されます。 対象の分片は shard によって選択されます。指定できるのは、固定の 1-based index (デフォルトは '1') 、クエリごとに ランダムな分片を選択する 'random'、またはクラスター内のすべての分片で各クエリを実行する 'all' です。分片内のレプリカは、 サーバーの load_balancing 設定に従って選択されます。 database カラムは、リモートサーバーへの接続のデフォルトデータベースを設定します。この デフォルトデータベースは接続ごとに一度だけ設定されるため、database の値ごとに専用の 接続プールが使われます。この接続プールは最初の使用時に作成され、テーブルの存続期間中は再利用されます。 DEFINERSQL SECURITY が効果を持つのはローカルモードだけであり、これらを cluster 設定と組み合わせるとエラーになります。リモートサーバーでは、クエリは クラスター設定の認証情報で認証され、通常の初期クエリとして実行されます。これらは system.query_logis_initial_query = 1 とそれぞれ固有の query_id とともに記録されます (それらを生成した INSERT には 関連付けられません) 。開始元のサーバーでは、送出されるクエリが system.query_logis_internal = 1 として記録されます。 このエンジンはクエリ結果を破棄するため、送出されるクエリは常に discard_query_data = 1 を付けて実行されます。したがって、SELECT クエリの結果データはネットワーク経由で 転送されません (これは settings カラムで設定された discard_query_data の値を上書きします) 。

クエリの完了を待機する

非同期モードでは、これまでにそのテーブルに送信されたすべてのクエリが完了するまでブロックするために、次のクエリを使用できます。

クエリログに記録された最近の SELECT クエリを再実行する:
最終更新日 2026年7月23日