このトピックでは、クエリのパフォーマンスを最適化するために、Hologres でテーブルグループとシャード数を指定する際の基本原則、シナリオ、およびポリシーについて説明します。また、テーブルグループとシャード数に関するよくある質問への回答も提供します。
推奨されるインスタンス仕様
実際には、データ量が予測可能な場合、シャード数の最適な範囲を決定する必要がある場合があります。最適なシャード数は、格納されるデータ量だけでなく、実際のアクセス頻度、アクセスされるデータの実際の量、ポイントクエリやデータ分析などのコンピューティング負荷の種類、書き込みスループット、テーブルグループ内のテーブル数にも関連しています。したがって、最適なシャード数の正確な値を取得することはできません。次の表は、特定のデータ量の範囲に対応する推奨シャード数とインスタンス仕様を示しています。推定データ量に基づいて適切な設定を選択できます。
データ行数 | 推奨シャード数 | 推奨インスタンス仕様 |
4000万未満 | 10~20 | 32 CPUコア以上 |
4000万~4億 | 20~40 | 64 CPUコア以上 |
4億~40億 | 40~80 | 128 CPUコア以上 |
40億~400億 | 80~240 | 256 CPUコア以上。この場合、テーブルグループを作成する必要がある場合があります。 |
400億~4000億 | 160~400 | 512 CPUコア以上。この場合、複数のテーブルグループを作成できます。 |
上記の表にある、異なるデータ行数に対応する推奨シャード数とインスタンス仕様は、唯一の基準ではありません。データ量の少ないテーブルを、シャード数の多いテーブルグループに追加することもできます。データ量の多いテーブルを、単一シャードのテーブルグループに追加することもできます。高並列性、高計算効率、高データ集中という要件を満たし、不要なシャッフルオーバーヘッドを防ぐために、ビジネスシナリオに基づいて適切なシャード数を選択する必要があります。
テーブルグループには、3,000個以下のテーブル(パーティション化された子テーブルを含む)を設定することをお勧めします。テーブルグループに多数のテーブルが存在する場合、メタデータが蓄積され、データ定義言語(DDL)ステートメントの実行速度が低下します。
次のプランのベストプラクティスに基づいて、テーブルグループを作成するかどうか、およびテーブルのテーブルグループを選択する方法を決定できます。
プラン1:デフォルトのテーブルグループを使用する
Hologres インスタンスが以下の条件を満たしている場合は、デフォルトのテーブルグループを使用することをお勧めします。Hologres インスタンスの仕様をアップグレードまたはダウングレードした後、デフォルトのテーブルグループのシャード数は変更されません。次のステートメントを実行して、シャード数をクエリできます。
SELECT * FROM hologres.hg_table_group_properties; -- サンプル結果 tablegroup_name | property_key | property_value -----------------+---------------+---------------- test_tg_default | is_default_tg | 1 test_tg_default | shard_count | 40 test_tg_default | tg_version | 1 test_tg_default | table_num | 1 (4 rows) -- Sample result:サンプル結果データ量
デフォルトのテーブルグループのシャード数が、データ量の要件を満たしています。この場合、デフォルトのテーブルグループにテーブルを作成できます。
全体サイズ
すべてのテーブルの合計データ量は制御可能で予測可能です。使用方法が大幅に変更されることはありません。
ローカル結合
デフォルトのテーブルグループ内のテーブルに対して、効率的なローカル結合操作を実行する必要があります。
プラン2:テーブルグループを作成する
デフォルトのテーブルグループでは要件を満たすことができず、複数のテーブルグループが必要になる場合があります。ほとんどの場合、以下の条件下では、インスタンスに複数のテーブルグループが必要になる可能性があります。
データ量
既存のテーブルグループのシャード数が、現在のテーブルの推定データ量に適切ではありません。シャード数が多く、データ量が少ない場合、過剰な小さなファイルが生成され、I/O オーバーヘッドが高くなります。シャード数が少なく、データ量が多い場合、クエリの並列性が低下します。この場合、複数のテーブルグループが必要です。
独立した負荷
既存のテーブルグループには多数のテーブルが含まれており、ほとんどのテーブルに同時にデータを書き込む必要があります。その結果、インスタンスの負荷が高くなります。さらに、作成されるテーブルには、高いクエリと書き込みのスループットが必要です。この場合、複数のテーブルグループを使用して、データの書き込みとクエリをある程度独立させる必要があります。詳細については、コンピューティングリソースを分離する方法に関するトピックを参照してください。既存のテーブルグループが書き込みとクエリの要件を満たすことができないと判断した場合は、複数のテーブルグループも必要です。
テーブルの相関関係
ビジネスの一連のテーブルに固有のデータ書き込みまたはクエリパターンがあり、ローカル結合の要件があるか、今後発生する可能性があり、既存のテーブルグループのテーブルとの相関関係がほとんどないか、まったくない場合は、一連のテーブルに対して複数の独立したテーブルグループを作成できます。ローカル結合操作は、結合キーを配布キーとして持ち、同じテーブルグループにあるテーブルに対してのみ実行できます。互いに強い相関関係を持つテーブルのセットに対してテーブルグループを作成できますが、既存のテーブルグループのテーブルとの相関関係は少なく、ローカル結合の可能性は低くなります。
インスタンスリソースのスケーリング
インスタンスが5倍以上スケールインまたはスケールアウトされた場合、元のシャード数が要件を満たさなくなる可能性があります。この場合、デフォルトのテーブルグループを変更できます。シャード数は、計算ノードの数よりも大きく、CPUコアの総数の60%未満である必要があります。
プラン3:複数のテーブルグループにテーブルを追加する
複数のテーブルグループを計画する必要がある場合は、ストレステストと本番の前に、テーブルグループの役割と意義、および各テーブルが属するテーブルグループを計画することをお勧めします。計画時には、次の要素を考慮できます。
データ量
シャード数は、テーブルに格納されるデータ量によって決まります。シャード数の多いテーブルグループは大きなテーブルに適しており、シャード数の少ないテーブルグループは小規模および中規模のテーブルに適しています。
必要な書き込みパフォーマンス
シャード数は、データ書き込みパフォーマンスと正の相関関係があります。単一シャードの書き込み機能には上限があります。シャードが多いほど、書き込みの並列性とスループットが高くなります。1秒あたりのレコード数(RPS)が高いテーブルにデータを書き込む必要がある場合は、より大きなシャード数が必要になる場合があります。単一コアのCPU使用率が100%の場合、Hologres の単一シャードは3,000~5,000 RPS(レコードあたり 1 KB)でデータを書き込みます。必要なRPSに基づいて、必要なシャード数を推定できます。各シャードは、データクエリなどの読み取り操作も実行する必要があります。したがって、データ書き込みのCPU使用率は100%に達することはできません。1/3 CPUコアを使用するシャードは、1,000 RPS(レコードあたり 1 KB)でデータを書き込みます。たとえば、60,000 RPSでデータを書き込み、各レコードのサイズが 1 KB の場合、シャード数は60より大きい必要があります。シャード数は微調整できます。
各テーブルグループの負荷
テーブルグループを作成するときは、このテーブルグループに追加するテーブルの数を考慮する必要があります。今後このテーブルグループに多数のテーブルが追加され、ほとんどのテーブルに頻繁にアクセスされる場合、シャード数が少ないと高並列クエリをサポートできない可能性があります。
FAQ
512 CPUコアのインスタンスがあり、リアルタイムイベントテーブルでオンライン分析処理(OLAP)を実行するために使用しています。テーブルには約200億~400億行が含まれています。この場合、テーブルグループとシャード数をどのように指定すればよいですか?
単一のコンピューティング負荷が関係するため、1つのテーブルグループを使用できます。512 CPUコアのインスタンスのデフォルトのシャード数は160です。イベントテーブルに数百列などの多数の列が含まれている場合は、シャード数を適切に増やすことでOLAPの並列性を向上させることができます。たとえば、データベースのデフォルトのテーブルグループのシャード数を200以上に変更して、イベントテーブルを格納します。
256 CPUコアのインスタンスと多数の列指向テーブルがあり、ミリ秒単位の高速OLAPを実行するためにインスタンスを使用しています。各テーブルには数千万行が含まれています。複数のフィールドに基づいてデータをグループ化し、条件に基づいて詳細をクエリしたいと思います。テーブルグループとシャード数をどのように指定すればよいですか?
単一のコンピューティング負荷が関係するため、1つのテーブルグループを使用できます。256 CPUコアのインスタンスのデフォルトのシャード数は120です。数千万行を含むテーブルの場合、10~20シャードを指定することをお勧めします。特にグループ化などの集計操作では、シャードが多いほどシャッフルオーバーヘッドが増加し、ミリ秒単位の分析を実装できません。したがって、デフォルトのテーブルグループでは要件を満たすことができない場合があります。より良い効果を得るためには、データベースのデフォルトのテーブルグループのシャード数を具体的な状況に基づいて16~40の値に変更し、ストレステストを実行できます。
低速クエリが不適切なシャード数によって引き起こされているかどうかを確認するにはどうすればよいですか?
不適切なシャード数の場合、シャード数が多すぎるか少すぎる可能性があります。
シャード数が多すぎる場合、クエリの起動オーバーヘッドまたはシャッフルオーバーヘッドが大きくなります。クエリの起動オーバーヘッドは、EXPLAIN ANALYZEステートメントの実行結果のstart query cost行から確認できます。シャッフルオーバーヘッドは、EXPLAIN ANALYZEステートメントの実行結果のRedistribution MotionのMax_GetNext_Timeサイズに基づいて判断できます。Hologres V0.10以降では、低速クエリログで履歴クエリのこれらのオーバーヘッドを表示できます。
シャード数が少なすぎる場合、長期の計算中にCPU使用率が100%に達することができず、並列性が不十分なためにデータのスキャンオーバーヘッドが大きくなるか、データ書き込みパフォーマンスが低下します。データのスキャンオーバーヘッドは、EXPLAIN ANALYZEステートメントの実行結果のScan NodeのMax_GetNext_Timeサイズに基づいて判断できます。単一コアのCPU使用率が100%の場合、Hologres の単一シャードは3,000~5,000 RPSでデータを書き込みます。実際のRPSをこの範囲と比較して、シャード数が少なすぎるかどうかを確認できます。
ポイントクエリシナリオでは、1秒あたりのクエリ数(QPS)が十分高くありません。この問題はシャードの不足が原因ですか?
まず、別の原因が存在するかどうかを判断します。たとえば、ポイントクエリではなく分析クエリが実行されている、インデックスが使用されていない、シャードが分割されていない、またはCPU使用率が100%に達しているなどです。他の考えられる原因がこの問題の原因ではない場合、単一のSQLステートメントで最高のパフォーマンスが達成され、QPSがまだ要件を満たしていない場合は、シャード数を増やすことでポイントクエリのバックエンド並列性を高めることができます。
シャードのデータスキューのトラブルシューティングを行うにはどうすればよいですか?
Hologres は、内部フィールド hg_shard_id を提供します。このフィールドは、データが存在するシャードのIDを指定します。SQLステートメントを実行して、シャードにデータスキューが存在するかどうかを確認できます。
SELECT hg_shard_id, COUNT(1) FROM <Table_Name> GROUP BY hg_shard_id ORDER BY COUNT(1) DESC;シャード内のデータ量が他のシャードのデータ量よりも大幅に大きい場合、データスキューが存在します。この場合、配布キーを調整する必要がある場合があります。