すべてのプロダクト
Search
ドキュメントセンター

PolarDB:すべてまたは一部のシャード化されたデータベースおよびテーブルのスキャン

最終更新日:Mar 29, 2026

SCAN HINT を使用すると、SQL ステートメントを、すべてまたは選択したデータベースシャードにわたるすべてまたは一部の物理テーブルシャードにルーティングし、結果をマージできます。PolarDB-X 1.0 のデフォルトルーティングをバイパスして、特定の物理テーブルを直接対象とする場合にご利用ください。

主な利用シーン:

  • 指定された論理テーブルに対応する各物理テーブルの行数をカウントする

  • 特定のデータベースシャード内のすべてのテーブルシャードをクエリする

SCAN HINT は PolarDB-X 1.0 V5.3 以降でご利用いただけます。DML ステートメント、DDL ステートメント、および一部の Data Access Language (DAL) ステートメントと併用可能です。

本トピックは PolarDB-X 1.0 5.3 以降に適用されます。

構文

-- すべてのデータベースシャード内のすべてのテーブルシャードをスキャン
SCAN()

-- 指定されたデータベースシャード内のすべてのテーブルシャードをスキャン
SCAN(NODE="node_list")

-- 条件から計算されたテーブルシャードをスキャン
SCAN(
  [TABLE=]"table_name_list"       -- 論理テーブル名
  , CONDITION="condition_string"  -- TABLE および CONDITION の値から物理テーブル名を計算
  [, NODE="node_list"] )          -- 結果を指定された物理データベースのみにフィルター

-- 明示的に指定された物理テーブルシャードをスキャン
SCAN(
  [TABLE=]"table_name_list"          -- 論理テーブル名
  , REAL_TABLE=("table_name_list")   -- 物理テーブル名(すべての物理データベースに適用)
  [, NODE="node_list"] )             -- 結果を指定された物理データベースのみにフィルター

パラメーター

パラメーター説明
NODE="node_list"対象とするデータベースシャードを指定します。GROUP_KEY または GROUP_INDEX の値を使用します。SHOW NODE コマンドを実行して、これらの値を取得してください。形式: {group_key | group_index} [, {group_key | group_index}]...
[TABLE=]"table_name_list"論理テーブル名を指定します。形式: table_name [, table_name]...
CONDITION="condition_string"物理テーブルを対象とするかどうかをフィルターする SQL WHERE 句です。各テーブルに対して条件を指定します(例: t1.id = 2 and t2.id = 2)。
REAL_TABLE=("table_name_list")物理テーブル名を明示的に指定します。これらのテーブルは、すべての物理データベースに対してクエリされます。

スキャンモードの選択

モード使用タイミング
SCAN()すべての物理シャードをスキャン — 最も広範囲なスコープ
SCAN(NODE=...)対象ノードが既知の場合、特定のデータベースシャードに限定
SCAN(TABLE=..., CONDITION=...)PolarDB-X 1.0 に、ご指定の条件に合致する物理テーブルを自動計算させます
SCAN(TABLE=..., REAL_TABLE=...)物理テーブル名を明示的に指定 — 実際のテーブル名を正確に把握している必要があります

注意事項

PolarDB-X 1.0 のヒントワードには、以下の 2 つのフォーマットがサポートされています:

  • /*+TDDL:hint_command*/

  • /!+TDDL:hint_command*/

MySQL コマンドラインクライアントで /*+TDDL:hint_command*/ フォーマットを使用する場合は、接続時に -c フラグを追加してください:

mysql -c -h <host> -P <port> -u <username> -p

-c フラグを指定しない場合、MySQL クライアントは SQL ステートメントをサーバーに送信する前にコメントを削除します。PolarDB-X 1.0 のヒントワードは /*+TDDL:...*/ 形式で MySQL コメントとして定義されているため、ヒントワードが削除され、効果が発揮されません。

PolarDB-X 1.0 の /*+TDDL:...*/ 形式のヒントワードは、MySQL コメント として処理されます。詳細については、「mysql クライアントのオプション」をご参照ください。

サンプル

すべてのデータベースシャード内のすべてのテーブルシャードをスキャン

SELECT /*+TDDL:scan()*/ COUNT(1) FROM t1

DRDS は、論理テーブル t1 のすべての物理テーブルにこのステートメントをルーティングし、結果セットをマージして最終的なカウント値を返します。

指定されたデータベースシャード内のすべてのテーブルシャードをスキャン

SELECT /*+TDDL:scan(node='0,1,2')*/ COUNT(1) FROM t1

DRDS は、データベースシャード 0000、0001、および 0002 内の論理テーブル t1 の物理テーブル名を計算し、そのシャードにステートメントをルーティングして結果セットをマージし、最終的なカウント値を返します。

条件から計算されたテーブルシャードをスキャン

SELECT /*+TDDL:scan('t1', condition='t1.id = 2')*/ COUNT(1) FROM t1

DRDS は、論理テーブル t1 のうち、指定された条件に合致する物理テーブルを計算し、そのシャードにステートメントをルーティングして結果セットをマージし、最終的なカウント値を返します。

複数テーブル間の JOIN クエリの場合:

SELECT /*+TDDL:scan('t1, t2', condition='t1.id = 2 and t2.id = 2')*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test"

DRDS は、それぞれの条件に一致する t1 および t2 の物理テーブルを計算し、ステートメントをルーティングして、結果をマージします。

重要

CONDITION を JOIN クエリで使用する場合、両方のテーブルは同一のデータベースシャードに属し、かつ Shard Count が一致している必要があります。これらの条件を満たさない場合、PolarDB-X 1.0 は異なるデータベースシャード上のテーブルシャードを解決しようとするため、DRDS でエラーが報告されます。

明示的に指定された物理テーブルシャードをスキャン

SELECT /*+TDDL:scan('t1', real_table=("t1_00", "t1_01"))*/ COUNT(1) FROM t1

DRDS は、すべてのデータベースシャードにわたって物理テーブルシャード t1_00 および t1_01 にこのステートメントをルーティングし、結果セットをマージして最終的なカウント値を返します。

明示的に指定された物理テーブルを含む JOIN クエリの場合:

SELECT /*+TDDL:scan('t1, t2', real_table=("t1_00,t2_00", "t1_01,t2_01"))*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHERE b.name = "test";

DRDS は、すべてのデータベースシャードにわたって t1_00t2_00t1_01、および t2_01 にステートメントをルーティングし、結果セットをマージして最終結果を返します。