MaxCompute と Hologres はシームレスに統合されています。ネイティブの Hologres ベクトルエンジンは MaxCompute データを直接読み取り、MaxCompute の複数レベルのパーティションフィルタリングと演算子プッシュダウンを使用してクエリ速度を最適化します。このトピックでは、外部テーブルを作成するか、データを Hologres にインポートすることによって、Hologres での MaxCompute データに対するクエリを高速化する方法について説明します。
外部テーブルの作成
Hologres で外部テーブルを作成すると、MaxCompute テーブルデータに対するクエリを直接高速化できます。この方法では、データのインポートやエクスポートは不要で、冗長なストレージも作成されません。MaxCompute で直接データをクエリする場合と比較して、この方法ではクエリパフォーマンスが 2〜5 倍向上します。MaxCompute データに対するクエリをさらに高速化するために、以下の最適化戦略を使用できます。
Serverless Computing を使用した外部テーブルのクエリ
Hologres V2.1.17 以降では、Serverless Computing がサポートされています。大量の MaxCompute データのオフラインインポート、大規模な抽出・変換・書き出し (ETL) ジョブ、または外部テーブル内の大量のデータに対するクエリなどのシナリオでは、Serverless Computing を使用してこれらのタスクを実行できます。この方法では、ご利用のインスタンス自体のリソースの代わりに、追加の Serverless リソースを直接使用します。インスタンス用に追加の計算リソースを予約する必要はありません。これにより、インスタンスの安定性が大幅に向上し、メモリ不足 (OOM) エラーの可能性が減少し、タスクに対してのみ課金されます。Serverless Computing の詳細については、「Serverless Computing」をご参照ください。Serverless Computing の使用方法の詳細については、「Serverless Computing の使用」をご参照ください。
新しい HQE 外部テーブル実行エンジンの使用
Hologres V0.10 以降では、新しい実行エンジンである HQE を使用して、MaxCompute 外部テーブルに対するクエリを高速化します。V0.10 より前のバージョンを実行しているインスタンスと比較して、クエリパフォーマンスは約 30% から 100% 向上します。
HQE 実行エンジンには、次の制限事項があります:
現在、高速化は ORC フォーマットを使用する MaxCompute テーブルに対してのみ有効です。CFile などの他のファイル形式の高速化はサポートされていません。
HQE は、MaxCompute トランザクションテーブルやスキーマが変更されたテーブル (スキーマエボリューション) に対するクエリを高速化しません。これらの場合、システムは自動的に SQE エンジンに切り替えて実行します。
MaxCompute テーブルと Hologres テーブル間のデータ型マッピングが正しいことを確認してください。そうでない場合、高速化の効果が損なわれます。
全表スキャンの回避
外部テーブルデータをクエリする際に全表スキャンを回避するには、次のようにクエリ文を最適化します:
データをクエリする際は、
SELECT a FROM xx文を使用して特定の列をクエリします。SELECT * FROM xxは使用しないでください。条件を追加してパーティションをフィルターするか、スキャンされるパーティションの数を減らして、スキャンされるデータ量を削減します。
SQE クエリの最適化
HQE がサポートしていないクエリシナリオでは、システムは自動的に SQE エンジンに切り替えて実行します。これにより、パフォーマンスリグレッションが発生する可能性があります。クエリパフォーマンスを最適化するには、次のように MaxCompute データソーステーブルを変更します:
MaxCompute テーブルのハッシュクラスタリングテーブルへの変換
ハッシュクラスタリングテーブルには、バケットプルーニングの最適化、集計の最適化、ストレージの最適化など、いくつかの利点があります。テーブルを作成する際に、`CLUSTERED BY` を使用してハッシュキーを指定すると、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 レベルインデックスを作成して、クラスタリングキーでの範囲クエリや複合キーのクエリなどのシナリオをサポートできます。
次の文は、テーブルをレンジクラスタリングテーブルに変換する方法を示しています。
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 で次の文を実行すると、テーブル内のファイル数を表示できます。MaxCompute での小さいファイルの最適化の詳細については、「小さいファイルの最適化とジョブ診断に関するよくある質問」をご参照ください。
desc extended <table_name>;クエリ結果では、FileNum はターゲットの MaxCompute テーブル内のファイル数を示し、Size はテーブルの合計サイズをバイト単位で示します。テーブルに 100 を超えるファイルがあり、平均ファイルサイズが 64 MB 未満の場合は、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;外部テーブルにアクセスするための最大同時実行数を設定します。デフォルト値は、インスタンスのコア数です。
--最大値は 128 です。大きな値は設定しないでください。これにより、外部テーブルのクエリ、特にデータインポートのシナリオで、他のクエリに影響を与え、システムビジーエラーが発生するのを防ぎます。このパラメーターは Hologres V1.1 以降で有効です。 set hg_foreign_table_executor_max_dop = 32;外部テーブルにアクセスする際に DML ステートメントを実行するための最大同時実行数を設定します。
--デフォルト値は 32 です。このパラメーターは、インポート操作がシステムリソースを過度に使用するのを防ぐために、データインポートおよびエクスポートのシナリオ向けに最適化されています。このパラメーターは Hologres V1.1 以降で有効です。 set hg_foreign_table_executor_dml_max_dop = 16;
Hologres へのデータインポート (推奨)
外部テーブルデータに対して広範な分析計算を実行し、それを内部テーブルと結合するには、Hologres で内部テーブルを作成し、外部テーブルデータをインポートします。必要に応じて、内部テーブルに適切な分散キーとインデックスプロパティを指定して、クエリを高速化できます。
Hologres へのデータインポートは、外部テーブルのクエリよりも高速です。クエリパフォーマンスを 10〜100 倍向上させることができます。MaxCompute 外部テーブルから Hologres にデータをインポートする方法の詳細については、「SQL を使用した MaxCompute からのデータインポート」をご参照ください。