MaxCompute と Hologres は基盤レイヤーでシームレスに統合されています。Hologres のネイティブ ベクトル エンジンを使用して、MaxCompute から直接データを読み取ることができます。また、MaxCompute の多層パーティション フィルタリングと演算子プッシュダウン機能を使用して、クエリを高速化することもできます。このトピックでは、外部テーブルを使用するか、MaxCompute から Hologres にデータをインポートすることで、MaxCompute テーブルのクエリを高速化する方法について説明します。
外部テーブルを作成する
Hologres に外部テーブルを作成して、MaxCompute テーブルのクエリを高速化できます。この方法では、データのエクスポートとインポートや冗長ストレージは必要ありません。MaxCompute でデータをクエリする方法と比較して、この方法ではクエリのパフォーマンスが 2 ~ 5 倍向上します。以下のセクションでは、外部テーブルを使用して MaxCompute テーブルからデータをクエリする場合に、クエリをさらに高速化できる方法について説明します。
サーバーレス コンピューティング機能を使用して外部テーブルをクエリする
Hologres V2.1.17 以降では、サーバーレス コンピューティング機能がサポートされています。サーバーレス コンピューティング機能は、大量のデータをオフラインでインポートする場合、大規模な抽出、変換、ロード (ETL) ジョブを実行する場合、または外部テーブルから大量のデータをクエリする場合に適しています。サーバーレス コンピューティング機能を使用して、追加のサーバーレス コンピューティング リソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティング リソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足 (OOM) エラーの発生が減少します。タスクで使用される追加のサーバーレス コンピューティング リソースに対してのみ課金されます。サーバーレス コンピューティング機能の詳細については、「サーバーレス コンピューティングの概要」をご参照ください。サーバーレス コンピューティング機能の使用方法の詳細については、「サーバーレス コンピューティングのユーザー ガイド」をご参照ください。
HQE を使用する
Hologres V0.10 以降では、Hologres Query Engine (HQE) がサポートされており、MaxCompute テーブルのクエリのパフォーマンスが約 30% ~ 100% 向上します。
HQE を使用する場合、次の制限事項に注意してください。
HQE を使用できるのは、Optimized Row Columnar (ORC) 形式の MaxCompute テーブルのクエリを高速化する場合のみです。CFile ファイルなどの他のファイルのクエリは高速化されません。
HQE を使用して、MaxCompute トランザクション テーブルまたはスキーマ進化が実行される MaxCompute テーブルのクエリを高速化することはできません。これらのクエリの場合、システムは自動的に Seahawks Query Engine (SQE) を使用します。
MaxCompute テーブルのデータ型が、MaxCompute テーブルをソースとする Hologres 外部テーブルのデータ型にマップされていることを確認してください。そうでない場合、クエリのパフォーマンスに悪影響を及ぼします。データ型マッピングの詳細については、「データ型」の「MaxCompute と Hologres 間のデータ型マッピング」セクションをご参照ください。
フル テーブル スキャンの防止
MaxCompute テーブルをクエリするときにフル テーブル スキャンを防ぐには、次のいずれかの方法を使用してクエリ ステートメントを最適化できます。
SELECT * FROM xx
ステートメントの代わりに、SELECT a FROM xx
ステートメントを使用します。こうすることで、クエリ範囲が絞り込まれます。パーティション フィルター条件を追加するか、スキャンするパーティションの数を減らします。これは、スキャンするデータ量の削減に役立ちます。
SQE ベースのクエリの最適化
HQE がサポートされていない場合、システムは自動的に SQE を使用します。この場合、クエリのパフォーマンスが低下する可能性があります。クエリのパフォーマンスを最適化するには、次のいずれかの方法を使用できます。
MaxCompute テーブルをハッシュ クラスタ化テーブルに変換する
ハッシュ クラスタ化テーブルは、バケット プルーニング、集計、およびストレージの最適化をサポートしています。MaxCompute テーブルを作成するときは、CLUSTERED BY 句を使用してハッシュ キーを指定します。MaxCompute は、指定された列に対してハッシュ演算を実行し、ハッシュ値に基づいて各バケットにデータを分散します。重複値が少ない列をハッシュ キー列として選択することをお勧めします。
MaxCompute テーブルをハッシュ クラスタ化テーブルに変換するには、次のステートメントを実行します。
ALTER TABLE <table_name> [CLUSTERED BY (<col_name> [, <col_name>, ...]) [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> BUCKETS];
ALTER TABLE
ステートメントを実行してハッシュ キーを指定すると、新しいパーティションのデータはハッシュ キーに基づいて格納されます。ハッシュ クラスタリングの詳細については、「ハッシュ クラスタリング」をご参照ください。MaxCompute テーブルをレンジ クラスタ化テーブルに変換する
レンジ クラスタリングは、グローバルにソートされた順序でデータを分散する新しいデータ クラスタリング方法です。レンジ クラスタリングは、ハッシュ クラスタリングによって発生する可能性のあるデータ スキューの問題を防ぐことができます。レンジ クラスタリングでは、2 つのレベルのインデックスを作成することもできます。レンジ クラスタリングは、クラスタ キーに基づくレンジ クエリやマルチキー クエリなどのシナリオに適しています。
MaxCompute テーブルをレンジ クラスタ化テーブルに変換するには、次のステートメントを実行します。
ALTER TABLE <table_name> [RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] [INTO <number_of_buckets> BUCKETS];
ALTER TABLE
ステートメントを実行してクラスタ キーを指定すると、新しいパーティションのデータはクラスタ キーに基づいて格納されます。レンジ クラスタリングの詳細については、「レンジ クラスタリング」をご参照ください。説明INSERT INTO
ステートメントを実行して、ハッシュ クラスタ化テーブルまたはレンジ クラスタ化テーブルにデータを書き込むことはできません。これらのテーブルにデータを書き込むには、INSERT OVERWRITE
ステートメントを実行します。Tunnel コマンドを使用してインポートされたデータは順番に並んでいません。したがって、Tunnel コマンドを使用してレンジ クラスタ化テーブルまたはハッシュ クラスタ化テーブルにデータをインポートすることはできません。
小さなファイルのマージ
クエリ対象の MaxCompute テーブルに多数の小さなファイルが存在する場合、クエリ速度が低下します。
MaxCompute で次のステートメントを実行して、クエリ対象のテーブル内のファイル数を確認できます。小さなファイルのマージ方法の詳細については、「小さなファイルの最適化とジョブ診断に関する FAQ」をご参照ください。
desc extended <table_name>;
コマンド出力では、FileNum パラメーターは目的の MaxCompute テーブル内のファイル数を示し、Size パラメーターはファイルの合計サイズをバイト単位で示します。MaxCompute テーブルに 100 個を超えるファイルが含まれており、平均ファイル サイズが 64 MB 未満の場合は、MaxCompute 内の小さなファイルをマージできます。
パラメーター設定の最適化
MaxCompute テーブルのクエリの場合、Hologres は特定のパラメーターにデフォルト値を提供して、データ読み取りの並列性を向上させます。これにより、クエリ効率が向上します。ビジネス要件に基づいてパラメーター設定を調整できます。
パラメーターのデフォルト値は、内部調整と実験に基づいて最適であることが証明されています。したがって、必要な場合を除き、デフォルト値を変更しないことをお勧めします。
hg_foreign_table_executor_max_dop
パラメーターを過度に小さい値に設定しないことをお勧めします。たとえば、このパラメーターを 1 に設定し、テーブルに対して書き込み操作とクエリ操作が同時に実行されると、ワークロードがワーカーに不均等に分散されます。その結果、OOM エラーが発生する可能性があります。
各クエリでヒットできるパーティションの最大数を設定するには、次のステートメントを実行します。
-- デフォルト値は 512 です。最大値は 1024 です。このパラメーターを過度に大きい値に設定しないことをお勧めします。クエリのパフォーマンスに悪影響を及ぼす可能性があります。 set hg_foreign_table_max_partition_limit = 128;
MaxCompute テーブルから同時に読み取るデータのサイズを設定するには、次のステートメントを実行します。
-- デフォルト値は 8192 です。 set hg_experimental_query_batch_size = 4096;
MaxCompute テーブルの各シャードのサイズを設定するには、次のステートメントを実行します。シャード サイズは、データ エントリを読み取る並列性に影響します。
-- デフォルト値は 64 MB です。テーブルのサイズが大きい場合は、このパラメーターの値を増やして、過剰なシャードがクエリのパフォーマンスを低下させるのを防ぐことができます。このパラメーターは、Hologres V1.1 以降でサポートされています。 set hg_foreign_table_split_size = 128;
MaxCompute テーブルを読み取る最大並列度を設定するには、次のステートメントを実行します。デフォルト値は、インスタンスの vCPU コア数と同じです。
-- 最大値は 128 です。大きい値を使用しないことをお勧めします。これにより、クエリが他のクエリに影響を与えたり、特にデータ インポート シナリオでシステムの過負荷によるエラーが発生したりするのを防ぎます。このパラメーターは、Hologres V1.1 以降でサポートされています。 set hg_foreign_table_executor_max_dop = 32;
MaxCompute テーブルからデータを読み取るときに同時に実行できる DML ステートメントの最大数を設定するには、次のステートメントを実行します。
-- デフォルト値は 32 です。このパラメーターは、データのインポートとエクスポートのシナリオで、インポート操作が過剰なシステム リソースを占有するのを防ぐために設計されています。このパラメーターは、Hologres V1.1 以降でサポートされています。 set hg_foreign_table_executor_dml_max_dop = 16;
(推奨) MaxCompute から Hologres にデータをインポートする
MaxCompute テーブルのデータに対して頻繁に分析および計算操作を実行し、MaxCompute テーブルを Hologres テーブルに接続する必要がある場合は、Hologres にテーブルを作成し、MaxCompute テーブルから Hologres テーブルにデータをインポートすることをお勧めします。ビジネス要件に基づいて、Hologres テーブルの分散キーを設定することもできます。これにより、クエリが高速化されます。
外部テーブルを作成する方法と比較して、この方法ではクエリのパフォーマンスが 10 ~ 100 倍向上します。MaxCompute テーブルから Hologres にデータをインポートする方法の詳細については、「SQL ステートメントを実行して MaxCompute から Hologres にデータをインポートする」をご参照ください。