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

PolarDB:OSS 外部テーブルを使用した OSS データへのアクセス

最終更新日:Apr 23, 2026

PolarDB は、外部テーブルを使用して Object Storage Service (OSS) 内の CSV 形式のデータを直接クエリできるため、ストレージコストを削減できます。このトピックでは、外部テーブルを使用して OSS 内のデータにアクセスする方法について説明します。

前提条件

ご利用の PolarDB クラスターは、次のいずれかの要件を満たす必要があります:

  • エンジンバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.25.4 以降。

  • エンジンバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.1 以降。

エンジンバージョンの確認方法については、「エンジンバージョンのクエリ」をご参照ください。

仕組み

OSS 外部テーブルを使用すると、クエリ頻度の低い CSV 形式のデータ (コールドデータ) を OSS に保存し、クエリや分析を行うことができます。OSS外表

制限事項

  • OSS 外部テーブルは、CSV ファイルのデータのみをクエリできます。

  • OSS 外部テーブルは、`CREATE`、`SELECT`、`DROP` 文のみをサポートします。

    説明

    `DROP` 操作は、PolarDB 内のテーブルメタデータを削除するだけで、OSS 内のデータファイルは削除しません。

  • OSS 外部テーブルは、インデックス、パーティショニング、トランザクションをサポートしていません。

  • CSV 形式のデータでサポートされているデータ型には、数値型、日時型、文字列型、NULL 値が含まれます。

    説明
    • 地理空間データ型はサポートされていません。

    • 圧縮された CSV ファイルはクエリできません。

    • NULL 値は、次のいずれかの条件を満たす場合にのみサポートされます:

      • カーネルバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。

      • カーネルバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。

    数値型

    サイズ

    符号付き範囲

    符号なし範囲

    説明

    TINYINT

    1 バイト

    -128 から 127

    0 から 255

    非常に小さい整数。

    SMALLINT

    2 バイト

    -32768 から 32767

    0 から 65535

    小さい整数。

    MEDIUMINT

    3 バイト

    -8388608 から 8388607

    0 から 16777215

    中程度のサイズの整数。

    INT または INTEGER

    4 バイト

    -2147483648 から 2147483647

    0 から 4294967295

    標準的な整数。

    BIGINT

    8 バイト

    -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807

    0 から 18,446,744,073,709,551,615

    大きい整数。

    FLOAT

    4 バイト

    -3.402823466E+38 から -1.175494351E-38; 0; 1.175494351E-38 から 3.402823466E+38

    0; 1.175494351E-38 から 3.402823466E+38

    単精度浮動小数点数。

    DOUBLE

    8 バイト

    -1.7976931348623157E+308 から -2.2250738585072014E-308; 0; 2.2250738585072014E-308 から 1.7976931348623157E+308

    0; 2.2250738585072014E-308 から 1.7976931348623157E+308

    倍精度浮動小数点数。

    DECIMAL

    DECIMAL(M,D) の場合、サイズは M > D であれば M+2 バイト、そうでなければ D+2 バイトです。

    M と D の値に依存します。

    M と D の値に依存します。

    10 進数。

    日時型

    サイズ

    範囲

    フォーマット

    説明

    DATE

    3 バイト

    1000-01-01 から 9999-12-31

    YYYY-MM-DD

    日付値。

    TIME

    3 バイト

    -838:59:59 から 838:59:59

    HH:MM:SS

    時間値または持続時間。

    YEAR

    1 バイト

    1901 から 2155

    YYYY

    年値。

    DATETIME

    8 バイト

    1000-01-01 00:00:00 から 9999-12-31 23:59:59

    YYYY-MM-DD HH:MM:SS

    日付と時刻を組み合わせた値。

    説明

    このデータ型では、月と日を 2 桁の数字にする必要があります。たとえば、`2020-1-1` ではなく `2020-01-01` と指定します。そうしないと、クエリが OSS にプッシュダウンされたときに失敗します。

    TIMESTAMP

    4 バイト

    1970-01-01 00:00:00 から 2038-01-19 03:14:07

    YYYY-MM-DD HH:MM:SS

    タイムスタンプ。日付と時刻を組み合わせた値です。

    説明

    このデータ型では、月と日を 2 桁の数字にする必要があります。たとえば、`2020-1-1` ではなく `2020-01-01` と指定します。そうしないと、クエリが OSS にプッシュダウンされたときに失敗します。

    文字列型

    サイズ

    説明

    CHAR

    0 から 255 バイト

    固定長文字列。

    VARCHAR

    0 から 65,535 バイト

    可変長文字列。

    TINYBLOB

    0 から 255 バイト

    最大長 255 文字のバイナリ文字列。

    TINYTEXT

    0 から 255 バイト

    短いテキスト文字列。

    BLOB

    0 から 65,535 バイト

    バイナリ形式の長いテキストデータ。

    TEXT

    0 から 65,535 バイト

    長いテキストデータ。

    MEDIUMBLOB

    0 から 16,777,215 バイト

    バイナリ形式の中程度の長さのテキストデータ。

    MEDIUMTEXT

    0 から 16,777,215 バイト

    中程度の長さのテキストデータ。

    LONGBLOB

    0 から 4,294,967,295 バイト

    バイナリ形式の特大テキストデータ。

    LONGTEXT

    0 から 4,294,967,295 バイト

    特大テキストデータ。

    NULL 値

    挿入

    • OSS 外部テーブルに NULL 値を挿入する。

      OSS 外部テーブルに NULL 値を挿入するには、テーブル作成時に対応する NULL 値マーカーである NULL_MARKER を指定します。OSS 外部テーブルの NULL_MARKER はデフォルトで NULL です。SHOW CREATE TABLE 文を実行して NULL 値マーカーを表示できます:

      SHOW CREATE TABLE t1;

      次の結果が返されます:

      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | Table | Create Table                                                                                                                                                                      |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | t1    | CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL
      ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
    • CSV ファイルに NULL 値を挿入する。

      CSV ファイルのフィールドに NULL_MARKER を挿入し、NULL_MARKER が二重引用符で囲まれていない場合、PolarDB はその値を NULL として認識します。

      説明
      • NULL_MARKER を二重引用符で囲むと、PolarDB はそれを文字列として認識します。その結果、is_null 文を使用して NULL 値を見つけることができず、CSV ファイルで NULL 値が割り当てられたパラメーターが OSS 外部テーブルの対応するパラメーターのデータ型と一致しない場合はエラーが報告されます。

      • NULL_MARKER は、数値、空の文字列、または次のいずれかの文字を含むことはできません:

        "\n\r、および ,

      次の文を使用して OSS 外部テーブルを作成します:

      CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `time` timestamp NULL DEFAULT NULL
      ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';

      データファイルに次の内容が含まれていると仮定します:

      1,"xiaohong","2022-01-01 00:00:00"
      NULL,"xiaoming","2022-02-01 00:00:00"
      3,NULL,"2022-03-01 00:00:00"
      4,"xiaowang",NULL

      OSS 外部テーブルをクエリすると、次のデータが返されます:

      SELECT * FROM t1;
      +------+----------+---------------------+
      | id   | name     | time                |
      +------+----------+---------------------+
      |    1 | xiaohong | 2022-01-01 00:00:00 |
      | NULL | xiaoming | 2022-02-01 00:00:00 |
      |    3 | NULL     | 2022-03-01 00:00:00 |
      |    4 | xiaowang | NULL                |
      +------+----------+---------------------+

    読み取り

    • CSV ファイルからデータが読み取られる際、CSV ファイル内の値が NULL で、OSS 外部テーブルの対応する列が NULL を許容する場合、その列は NULL に設定されます。

    • NOT NULL として定義された列に対して CSV ファイルから NULL 値が読み取られると、競合が発生します。結果は SQL モードによって異なります。

      • sql_modeSTRICT_TRANS_TABLES に設定されている場合、エラーが報告されます。

      • sql_modeSTRICT_TRANS_TABLES 以外のモードに設定されている場合、列は定義されたデフォルト値に設定されます。デフォルト値が定義されていない場合は、そのデータ型の MySQL のデフォルト値に設定されます。詳細については、「データ型のデフォルト値」をご参照ください。警告も返されます。SHOW WARNINGS; コマンドを使用して警告の詳細を表示します。

    説明

    現在の SQL モードを表示するには、SHOW VARIABLES LIKE "sql_mode"; コマンドを使用します。また、PolarDB コンソールに移動して、設定と管理 > パラメーター ページで sql_mode パラメーターを変更することもできます。詳細については、「パラメーターの変更」をご参照ください。

    id カラムが NOT NULL であり、デフォルト値がない t という名前の OSS 外部テーブルを作成します。

    CREATE TABLE `t` (
      `id` int(11) NOT NULL
    ) ENGINE=CSV 
    CONNECTION="server_name";

    CSV ファイル t.CSV に次の内容が含まれていると仮定します:

    NULL
    2

    OSS 外部テーブルを使用して CSV ファイルからデータを読み取る際に、次の 2 つのシナリオが発生する可能性があります:

    • sql_modeSTRICT_TRANS_TABLES に設定されている場合、次のコマンドを実行して CSV ファイルからデータをクエリします:

      SELECT * FROM t;

      次のエラーメッセージが報告されます:

      ERROR 1364 (HY000): Field 'id' doesn't have a default value
    • sql_modeSTRICT_TRANS_TABLES 以外のモードに設定されている場合、次のコマンドを実行して CSV ファイルからデータをクエリします:

      SELECT * FROM t;

      次の結果が返されます:

      +----+
      | id |
      +----+
      |  0 |
      |  2 |
      +----+
      2 rows in set, 1 warning (0.00 sec)

      結果の 0 は MySQL のデフォルト値です。次のコマンドを実行して警告メッセージを表示します:

      SHOW WARNINGS;

      以下の結果が返されます。

      +---------+------+-----------------------------------------+
      | レベル      | コード  | メッセージ                               |
      +---------+------+-----------------------------------------+
      | 警告      | 1364 | 'id' フィールドにはデフォルト値がありません            |
      +---------+------+-----------------------------------------+
      セット内に 1 行 (0.00 秒)

パラメーター

PolarDB コンソール設定と管理 > パラメーター ページで、次のパラメーターを表示または変更できます:

パラメーター

スコープ

説明

loose_csv_oss_buff_size

セッション

単一の OSS スレッドが使用できるメモリ量をバイト単位で設定します。デフォルト値は 134217728 です。

有効な値:4096 から 134217728

loose_csv_max_oss_threads

グローバル

同時実行可能な OSS スレッドの最大数を設定します。デフォルト値は 1 です。

有効な値:1 から 100

OSS 機能の最大合計メモリは、loose_csv_max_oss_threads * loose_csv_oss_buff_size として計算されます。

説明

メモリ不足の問題を防ぐため、OSS 機能の合計メモリは現在のノードのメモリの 5% を超えないようにしてください。

操作手順

OSS サーバーの作成

OSS サーバーを作成して接続情報を追加し、OSS に接続します。

説明

セキュリティ上の理由から、OSS への接続方法は OSS サーバーの作成のみがサポートされています。

新しいバージョン

ご利用のデータベースクラスターが次のいずれかの条件を満たす場合は、次の構文を使用します:

  • カーネルバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。

  • カーネルバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。

CREATE SERVER <server_name> 
FOREIGN DATA WRAPPER oss OPTIONS 
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);
説明
  • オプションの DATABASE パラメーターは oss_prefix と同等です。oss_prefix の使用を推奨します。

  • oss_sts_token パラメーターを使用するには、次のいずれかの条件を満たす必要があります:

    • カーネルバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.29 以降。

    • カーネルバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.6 以降。

次の表にパラメーターを説明します。

パラメーター

必須

説明

server_name

文字列

はい

OSS サーバーの名前。

説明

このパラメーターはグローバルであり、一意である必要があります。名前は大文字と小文字を区別せず、最大長は 64 文字です。64 文字を超える名前は自動的に切り捨てられます。OSS サーバー名を引用符で囲んだ文字列として指定できます。

my_database_name

文字列

いいえ

CSV データファイルを含む OSS 内のディレクトリ。

説明

DATABASEmy_oss_prefix の両方のパラメーターが指定されている場合、PolarDB は my_oss_prefix/DATABASE パス内のファイルを検索します。DATABASE パラメーターの追加方法の詳細については、以下の内容をご参照ください。

my_oss_endpoint

文字列

はい

対応する OSS リージョンのエンドポイント。

説明

Alibaba Cloud ホストからデータベースにアクセスする場合は、名前に「internal」が含まれる内部エンドポイントを使用して、パブリックネットワークトラフィックを回避します。

たとえば、中国 (杭州) リージョンの内部エンドポイントは oss-cn-hangzhou-internal.aliyuncs.com です。

my_oss_bucket

文字列

はい

データファイルが保存されている OSS バケット。このバケットは事前に OSS で作成しておく必要があります。

説明

最高のパフォーマンスを得るには、OSS バケットと PolarDB データベースクラスターを同じアベイラビリティゾーンに配置して、ネットワーク遅延を削減します。

my_oss_access_key_id

文字列

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID

my_oss_access_key_secret

文字列

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret

my_oss_prefix

文字列

いいえ

CSV データファイルを含む OSS 内のディレクトリ。

my_oss_sts_token

文字列

いいえ

STS 一時アクセス認証情報。

説明
  • このパラメーターは、STS 一時アクセス認証情報を使用して OSS にアクセスする場合に必須です。

  • my_oss_sts_token パラメーターにはデフォルトの有効期限があります。my_oss_sts_token が期限切れになった場合は、次のコマンドを実行して EXTRA_SERVER_INFO 内のすべてのパラメーター値をリセットする必要があります。

    ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
    "oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
    "oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

古いバージョン

ご利用のデータベースクラスターが次のいずれかの条件を満たす場合は、次の構文を使用します:

  • カーネルバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.25.4 から 8.0.1.1.27 の間。

  • カーネルバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.1 から 8.0.2.2.4 の間。

CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
);                  
説明

このバージョンでは、構文は oss_prefix および oss_sts_token パラメーターをサポートしていません。

次の表にパラメーターを説明します。

パラメーター

必須

説明

server_name

文字列

はい

OSS サーバーの名前。

説明

このパラメーターはグローバルであり、一意である必要があります。名前は大文字と小文字を区別せず、最大長は 64 文字です。64 文字を超える名前は自動的に切り捨てられます。OSS サーバー名を引用符で囲んだ文字列として指定できます。

my_database_name

文字列

いいえ

CSV データファイルを含む OSS 内のディレクトリの名前。

my_oss_endpoint

文字列

はい

対応する OSS リージョンのエンドポイント。

説明

Alibaba Cloud ホストからデータベースにアクセスする場合は、名前に「internal」が含まれる内部エンドポイントを使用して、パブリックネットワークトラフィックを回避します。

例:oss-cn-hangzhou-internal.aliyuncs.com

my_oss_bucket

文字列

はい

データファイルが保存されている OSS バケット。バケットは事前に OSS で作成しておく必要があります。

my_oss_access_key_id

文字列

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID

my_oss_access_key_secret

文字列

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret

説明

OSS サーバーを作成するには SERVERS_ADMIN 権限が必要です。SHOW GRANTS FOR <username>; コマンドを実行して、現在のユーザーが SERVERS_ADMIN 権限を持っているかどうかを確認できます。現在、高権限アカウントはこの権限をデフォルトで持っており、低権限アカウントに付与できます。

  • SERVERS_ADMIN 権限がない場合、次のエラーが返されます:Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation

  • SERVERS_ADMIN 権限を持たない標準アカウントを使用している場合、高権限アカウントは GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION を実行して権限を付与できます。

  • 高権限アカウントを持っていても SERVERS_ADMIN 権限がない場合は、PolarDB コンソール設定と管理 > アカウント管理 ページに移動して権限をリセットします。しばらく待ってから高権限アカウントを再度確認すると、アカウントに SERVERS_ADMIN 権限が付与されます。これらの手順を試しても高権限アカウントに SERVERS_ADMIN 権限がない場合は、チケットを送信してお問い合わせいただくか、DingTalk でグループ番号を検索してお問い合わせください。

  • 高権限アカウントは SELECT Server_name, Extra_server_info FROM mysql.servers; を実行して OSS サーバー情報を表示できます。セキュリティのため、oss_access_key_idoss_access_key_secret のパラメーター値は暗号化されており、表示できません。

データのアップロード

ossutil コマンドラインツールを使用して、ローカルの CSV ファイルを Object Storage Service (OSS) にアップロードできます。

説明
  • CSV ファイルをアップロードする OSS ディレクトリは、OSS サーバーの DATABASE または oss_prefix パラメーターで指定されたディレクトリと一致する必要があります。

  • アップロードする CSV ファイルの名前は <foreign_table_name>.CSV の形式で、.CSV 拡張子は 大文字である必要があります。たとえば、OSS 外部テーブルの名前が t1 の場合、CSV ファイルの名前は t1.CSV である必要があります。

  • CSV ファイルのデータフィールドは、OSS 外部テーブルの列と一致する必要があります。たとえば、OSS 外部テーブル t1INT 型の単一列 id がある場合、アップロードする CSV ファイルにも INT フィールドが 1 つだけ含まれている必要があります。

  • ローカルの MySQL データベースからデータファイルを直接アップロードし、テーブル定義に基づいて対応する OSS 外部テーブルを作成することを推奨します。

OSS 外部テーブルの作成

OSS サーバーを定義した後、PolarDB に OSS 外部テーブルを作成して、OSS 内の CSV ファイルにマッピングします。例:

CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";

connection_string は、スラッシュ (/) で結合された次の部分で構成されます:

  • OSS サーバー名。

  • (オプション) OSS 内のデータファイルへのパス。

    説明

    データファイルパスは、次のいずれかの条件を満たす場合にのみサポートされます。

    • カーネルバージョンMySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。

    • カーネルバージョンMySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。

  • (オプション) データファイルの名前。

    説明
    • データファイル名に .CSV サフィックスを含めないでください。

    • データファイル名を指定しない場合、現在のテーブルに対応する OSS ファイルは <current_table_name>.CSV です。データファイル名を指定した場合、対応する OSS ファイルは <specified_data_file_name>.CSV です。

    • OSS 内のデータファイルへのパスを指定する場合は、データファイル名も指定する必要があります。そうしないと、システムはパスの最後のセグメントをファイル名として扱います。

OSS 外部テーブルの表示

OSS 外部テーブルが作成された後、SHOW CREATE TABLE <table_name>; を実行してその定義を表示できます。テーブルのエンジンが CSV であること (つまり ENGINE=CSV) を確認します。そうでない場合、ご利用の PolarDB データベースクラスターのバージョンが古すぎて OSS エンジンをサポートしていない可能性があります。詳細については、「前提条件」をご参照ください。

CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";

この例は connection_string の構成を示しています:

  • OSS サーバー名:server_name

  • OSS 内のデータファイルへのパス:oss_prefix/a/b/c/d/

  • データファイル:t1。実際のファイルは t1.CSV ですが、要件に従って .CSV サフィックスは省略されています。

説明

OSS 外部テーブルのデータファイルは名前でのみ指定できます。たとえば、次の文では、PolarDB は OSS の oss_prefix パスで t2.CSV ファイルを検索します。

CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";

データのクエリ

次の例では、前のステップで作成した t1 テーブルをクエリします。

-- t1 テーブルの行数をカウントします。
SELECT count(*) FROM t1;

-- 範囲クエリ。
SELECT id FROM t1 WHERE id < 10 AND id > 1;

-- ポイントクエリ。
SELECT id FROM t1 where id = 3;

-- 複数テーブルの結合。
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";

次の表は、データクエリ中に発生する可能性のある一般的なエラーとその解決策を示しています。

説明

クエリがエラーではなく警告を返す場合は、SHOW WARNINGS; を実行して警告の詳細を表示します。

エラーメッセージ

原因

解決策

OSS error: No corresponding data file on the OSS engine.

OSS で対応するデータファイルが見つかりませんでした。

データファイルが OSS の期待されるパスに存在するかどうかを確認します。

  • ファイルが存在する場合、ファイル名が <foreign_table_name>.CSV 形式に従っており、.CSV 拡張子が大文字であることを確認します。

  • ファイルが存在しない場合は、ターゲットパスにアップロードします。

There is not enough memory space for OSS transmission. Currently requested memory %d.

OSS クエリのためのメモリが不足しています。

このエラーを解決するには:

  • コンソールの [パラメーター] ページに移動し、loose_csv_max_oss_threads パラメーターの値を増やして、より多くの OSS スレッドを許可します。

  • FLUSH TABLE を実行して、他の OSS テーブルが保持しているスレッドを解放します。

ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80;

データベースクラスターが OSS サーバーに接続できません。

データベースインスタンスと OSS バケットが同じアベイラビリティゾーンにあるかどうかを確認します。

  • そうでない場合は、データベースインスタンスと OSS バケットを同じアベイラビリティゾーンに配置します。

  • 同じアベイラビリティゾーンにある場合は、パブリックエンドポイントに切り替えます。エラーが解決しない場合は、Alibaba Cloud サポートにお問い合わせください。

クエリの最適化

OSS エンジンは、適格な条件をリモートの OSS エンジンにプッシュダウンすることで、クエリのパフォーマンスを向上させます。この最適化は エンジン条件プッシュダウンと呼ばれます。条件プッシュダウンには次の制限が適用されます:

  • UTF-8 でエンコードされた CSV テキストファイルのみがサポートされます。

  • SQL 文では、次の種類の演算子と算術式のみがサポートされます:

    • 比較演算子:><>=<===

    • 論理演算子:LIKEINANDOR

    • 算術式:+ - * /

  • 単一ファイルのクエリのみがサポートされます。`JOIN`、`ORDER BY`、`GROUP BY`、または `HAVING` 句を使用するクエリはサポートされていません。

  • WHERE 句に集約操作を含めることはできません。たとえば、where max(age) > 100 は許可されません。

  • 最大列数は 1,000 で、SQL 文の列名の最大長は 1,024 バイトです。

  • LIKE 句では、最大 5 つの % ワイルドカードがサポートされます。

  • IN 句では、最大 1,024 の定数がサポートされます。

  • CSV ファイルの場合、行ごとの最大サイズは 256 KB、列ごとの最大サイズは 256 KB です。

  • SQL 文の最大長は 16 KB です。WHERE 句には最大 20 の式を含めることができ、クエリには最大 100 の集約操作を含めることができます。

説明

この機能はデフォルトで無効になっています。有効にするには、 SET SESSION optimizer_switch='engine_condition_pushdown=on'; コマンドを実行します。

これらの条件を満たすクエリは OSS エンジンにプッシュダウンされます。OSS 外部テーブルの実行計画を確認して、どの条件がプッシュダウンされるかを確認します。

  • EXPLAIN を使用して OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra                                                                                                                            |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15000 |     1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    With pushed engine condition に続く条件は、リモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC はプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。

  • tree 形式を使用して OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN FORMAT=tree  SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                           |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | -> Sort: <temporary>.id DESC
        -> Table scan on <temporary>
            -> Aggregate using temporary table
                -> Filter: (t1.`name` like '%1%%%%%')  (cost=1690.00 rows=185)
                    -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) )  (cost=1690.00 rows=15000)
     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    engine conditions: に続く条件は、リモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC はプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。

    説明

    ご利用のクラスターは PolarDB for MySQL 8.0.2 以降を実行している必要があります。「バージョン番号のクエリ」の指示に従ってクラスターのバージョンを確認できます。

  • JSON 形式を使用して OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN FORMAT=json  SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {
      "query_block": {
        "select_id": 1,
        "cost_info": {
          "query_cost": "1875.13"
        },
        "ordering_operation": {
          "using_filesort": false,
          "grouping_operation": {
            "using_temporary_table": true,
            "using_filesort": true,
            "cost_info": {
              "sort_cost": "185.13"
            },
            "table": {
              "table_name": "t1",
              "access_type": "ALL",
              "rows_examined_per_scan": 15000,
              "rows_produced_per_join": 185,
              "filtered": "1.23",
              "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))",
              "cost_info": {
                "read_cost": "1671.49",
                "eval_cost": "18.51",
                "prefix_cost": "1690.00",
                "data_read_per_join": "146K"
              },
              "used_columns": [
                "id",
                "name"
              ],
              "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')"
            }
          }
        }
      }
    } |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    同様に、 engine_condition フィールドの条件はリモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC はプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。

次のエラーが表示された場合、OSS データファイル内の一部の文字がエンジン条件プッシュダウンと互換性がないことを示しています。

OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.

hint または optimizer_switch を使用して、エンジン条件プッシュダウンを手動で無効にすることができます。

  • ヒント

    ヒントを使用して、特定のクエリのエンジン条件プッシュダウンを無効にします。たとえば、 t1 テーブルのエンジン条件プッシュダウンを無効にするには:

    SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;
  • optimizer_switch

    optimizer_switch を使用して、現在のセッションのすべてのクエリでエンジン条件プッシュダウンを無効にします。

    SET SESSION optimizer_switch='engine_condition_pushdown=off'; # 現在のセッションのエンジン条件プッシュダウンを無効にします。

    現在のセッションのエンジン条件プッシュダウンの状態を確認するには、次のコマンドを実行します:

    select @@optimizer_switch;

OSS サーバー情報の同期

PolarDB クラスター内のプライマリノードと読み取り専用ノードは、単一の OSS サーバーを共有し、すべてのノードからのデータアクセスを可能にします。このロックフリー同期により、各ノードでの操作が独立して行われることが保証されます。

OSS サーバー情報を変更すると、変更はロックなしで読み取り専用ノードに同期されます。読み取り専用ノードのスレッドが OSS サーバーのロックを保持している場合、この同期が遅延することがあります。この場合、/*force_node='pi-bpxxxxxxxx'*/ flush privileges; または /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; を実行して、読み取り専用ノードの OSS サーバー情報を手動で更新します。