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 t1DRDS は、論理テーブル t1 のすべての物理テーブルにこのステートメントをルーティングし、結果セットをマージして最終的なカウント値を返します。
指定されたデータベースシャード内のすべてのテーブルシャードをスキャン
SELECT /*+TDDL:scan(node='0,1,2')*/ COUNT(1) FROM t1DRDS は、データベースシャード 0000、0001、および 0002 内の論理テーブル t1 の物理テーブル名を計算し、そのシャードにステートメントをルーティングして結果セットをマージし、最終的なカウント値を返します。
条件から計算されたテーブルシャードをスキャン
SELECT /*+TDDL:scan('t1', condition='t1.id = 2')*/ COUNT(1) FROM t1DRDS は、論理テーブル 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 t1DRDS は、すべてのデータベースシャードにわたって物理テーブルシャード 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_00、t2_00、t1_01、および t2_01 にステートメントをルーティングし、結果セットをマージして最終結果を返します。