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

PolarDB:すべてまたは一部のデータベースシャード内のすべてまたは一部のテーブルシャードをスキャンする

最終更新日:May 29, 2024

このトピックでは、すべてまたは一部のデータベースシャード内のすべてまたは一部のテーブルシャードをスキャンするために使用できるヒント構文とサンプルコードについて説明します。

このトピックで提供される情報は、PolarDB-X 1.0 V5.3以降に適用されます。

DRDSは、SQLステートメントを1つ以上のデータベースシャードにルーティングして実行する機能を提供します。 PolarDB-X 1.0では、すべてまたは一部のデータベースシャード内のすべてまたは一部のテーブルシャードをスキャンするためのSCAN HINTも提供されます。 SCAN HINTを使用して、SQL文をすべてのデータベースシャードに一度にルーティングできます。 たとえば、指定したデータベースシャード内のすべてのテーブルシャードを照会したり、指定した論理テーブルに対応する各物理テーブル内のデータ量を照会したりできます。

SCAN HINTを使用して、次の方法でSQL文を実行できます。
  1. すべてのデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
  2. 指定されたデータベースシャード内のすべてのテーブルシャードに対してSQL文を実行します。
  3. 指定されたデータベースシャード内の指定されたテーブルシャードに対してSQL文を実行します。 物理テーブルの名称は、与えられた条件に基づいて計算される。
  4. 指定されたデータベースシャード内の指定されたテーブルシャードに対して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_00t2_00t1_01、およびt2_01にルーティングします。 SQL文が実行されると、DRDSは結果セットをマージして最終結果を返します。