このトピックでは、すべてまたは一部のデータベースシャード内のすべてまたは一部のテーブルシャードをスキャンするために使用できるヒント構文とサンプルコードについて説明します。
このトピックで提供される情報は、PolarDB-X 1.0 V5.3以降に適用されます。
DRDSは、SQLステートメントを1つ以上のデータベースシャードにルーティングして実行する機能を提供します。 PolarDB-X 1.0では、すべてまたは一部のデータベースシャード内のすべてまたは一部のテーブルシャードをスキャンするためのSCAN HINT
も提供されます。 SCAN HINT
を使用して、SQL文をすべてのデータベースシャードに一度にルーティングできます。 たとえば、指定したデータベースシャード内のすべてのテーブルシャードを照会したり、指定した論理テーブルに対応する各物理テーブル内のデータ量を照会したりできます。
SCAN HINT
を使用して、次の方法でSQL文を実行できます。- すべてのデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
- 指定されたデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
- 指定されたデータベースシャード内の指定されたテーブルシャードに対してSQL文を実行します。 物理テーブルの名称は、与えられた条件に基づいて計算される。
- 指定されたデータベースシャード内の指定されたテーブルシャードに対してSQL文を実行します。 テーブルシャードは、物理テーブルの名前を使用して明示的に指定されます。
SCAN HINT
は、DMLステートメント、DDLステートメント、および一部のデータアクセス言語 (DAL) ステートメントで使用できます。
構文
# スキャンヒント
# すべてのデータベースシャード内のすべてのテーブルシャードにSQL文をルーティングします。
SCAN()
# 指定されたデータベースシャード内のすべてのテーブルシャードにSQL文をルーティングします。
SCAN(NODE="node_list") # データベースシャードを指定します。
# 指定されたデータベースシャード内の指定されたテーブルシャードにSQLステートメントをルーティングします。 物理テーブルの名称は、与えられた条件に基づいて計算される。
スキャン (
[TABLE=]"table_name_list"# 論理テーブルの名前を指定します。
CONDITION="condition_string"# TABLEパラメーターとCONDITIONパラメーターの値に基づいて、物理テーブルの名前を計算します。
[, NODE="node_list"] ) # CONDITIONパラメーターの値に基づいて取得した結果をフィルター処理し、指定した物理データベースにあるテーブルの名前のみを保持します。
# 指定されたデータベースシャード内の指定されたテーブルシャードにSQLステートメントをルーティングします。 テーブルシャードは、物理テーブルの名前を使用して明示的に指定されます。
スキャン (
[TABLE=]"table_name_list"# 論理テーブルの名前を指定します。
, REAL_TABLE=("table_name_list") # 物理テーブルの名前を指定します。 これらの物理テーブル名は、すべての物理データベースのデータを照会するために使用されます。
[, NODE="node_list"] ) # CONDITIONパラメーターの値に基づいて取得した結果をフィルター処理し、指定した物理データベースにあるテーブルの名前のみを保持します。
# 物理テーブルシャードまたは論理テーブルの名前を指定します。
table_name_list:
table_name [, table_name]...
# GROUP_KEYおよびGROUP_INDEXを使用して物理データベースを指定します。 GROUP_KEYおよびGROUP_INDEXの値を取得するには、SHOW NODEステートメントを実行します。
node_list:
{group_key | group_index} [, {group_key | group_index}]...
# SQL WHERE句を指定します。 t1.id = 2やt2.id = 2など、各テーブルの条件を指定する必要があります。
condition_string:
where_condition
注意
- PolarDB-X 1.0ヒントは、
/* + TDDL:hint_command */
および/!+ TDDL:hint_command */
の形式で指定できます。 /* + TDDL:hint_command */
形式でヒントを指定する場合は、MySQLコマンドラインクライアント: mysqlへのログインに使用するコマンドに-c
パラメーターを追加します。 これにより、クライアントでPolarDB-X 1.0ヒントを含むSQL文を実行できます。 -cパラメーターを追加しない場合、クライアントはSQL文をサーバーに送信して実行する前に、SQL文のコメントを削除します。 この形式のPolarDB-X 1.0ヒントは、MySQLコメントとして定義されます。 したがって、PolarDB-X 1.0ヒントは削除され、有効になりません。 詳細については、「mysql client options」をご参照ください。
例
- すべてのデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
SELECT /* + TDDL:scan()*/ COUNT(1) FROM t1
SQL文が実行されると、DRDSはSQL文を論理テーブル
t1
のすべての物理テーブルにルーティングします。 次に、DRDSは結果セットをマージし、最終結果を返します。 - 指定されたデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
SELECT /* + TDDL:scan(node='0,1,2 ')*/ COUNT(1) FROM t1
SQL文が実行されると、DRDSは、データベースシャード0000、0001、および0002内の論理テーブル
t1
の物理テーブルの名前を計算します。 次に、DRDSはSQLステートメントをテーブルシャードにルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。 - 指定された条件に基づいて、指定されたテーブルシャードに対してSQLステートメントを実行します。
SELECT /* + TDDL:scan('t1', condition='t1.id = 2 ')*/ COUNT(1) FROM t1
SQL文が実行されると、DRDSは論理テーブル
t1
に対応し、条件
を満たすすべての物理テーブルの名前を計算します。 次に、DRDSはSQLステートメントを指定されたテーブルシャードにルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。 - 指定された条件に基づいて、指定されたテーブルシャードでJOIN句を含むSQLステートメントを実行します。
SELECT /* + TDDL:scan('t1, t2', condition='t1.id = 2 and t2.id = 2 ')*/ * FROM t1 a JOIN t2 b ON a.id = b.id WHER E b.name = "test"
SQL文が実行されると、DRDSは、論理テーブル
t1
およびt2
に対応し、条件
を満たす物理テーブルの名前を計算します。 次に、DRDSはSQLステートメントを指定されたテーブルシャードにルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。 注: このヒントを使用する場合は、2つのテーブルが同じデータベースシャードに属していることを確認する必要があります。 また、一方のテーブルのシャードの数が、もう一方のテーブルのシャードの数と同じであることを確認する必要があります。 それ以外の場合、PolarDB-X 1.0によって取得されたテーブルシャード名は、同じデータベースシャードにないテーブルシャードを表します。 この問題が発生すると、DRDSはエラーを報告します。 - 指定されたデータベースシャード内の指定されたテーブルシャードに対してSQL文を実行します。 テーブルシャードは、物理テーブルの名前を使用して明示的に指定されます。
SELECT /* + TDDL:scan('t1', real_table=("t1_00", "t1_01"))*/ COUNT (1) FROM t1
SQL文が実行されると、DRDSはSQL文をすべてのデータベースシャードのテーブルシャード
t1_00およびt1_01
にルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。 - 指定されたデータベースシャード内の指定されたテーブルシャードに対してJOIN句を含むSQLステートメントを実行します。 テーブルシャードは、物理テーブルの名前を使用して明示的に指定されます。
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 WHER E b.name = "test";
SQL文が実行されると、DRDSはSQL文をすべてのデータベースシャードのテーブルシャード
t1_00
、t2_00
、t1_01
、およびt2_01
にルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。