Hologresテーブルへのデータの書き込みまたは更新のパフォーマンスがビジネスの期待を満たしていない場合は、このトピックで提供されている方法に基づいて原因を分析できます。原因は、ソーステーブルからのデータ読み取りの遅延、またはHologresリソースのボトルネックである可能性があります。このようにして、適切な最適化方法を使用して、データの書き込みと更新のパフォーマンスを向上させることができます。
背景情報
ワンストップのリアルタイムデータウェアハウスエンジンとして、Hologresは大量のデータのリアルタイムでの書き込みと更新をサポートし、ビッグデータシナリオで高パフォーマンスと低レイテンシを提供します
仕組み
書き込みまたは更新のパフォーマンスを最適化する方法を学ぶ前に、Hologresの仕組みを理解する必要があります。これは、実際のビジネスでHologresを使用する場合、さまざまな書き込みモードでのHologresの書き込みパフォーマンスをより適切に推定するのに役立ちます。
書き込みまたは更新のパフォーマンスは、テーブルストレージモードによって異なります。
テーブルのすべての列にデータを書き込むか、データを更新する場合、ストレージモードはパフォーマンスの高い順に次のとおりです。
行指向ストレージ > 列指向ストレージ > 行列ハイブリッドストレージ。テーブルの指定された列にデータを書き込むか、データを更新する場合、ストレージモードはパフォーマンスの高い順に次のとおりです。
行指向ストレージ > 行列ハイブリッドストレージ > 列指向ストレージ。
書き込みまたは更新のパフォーマンスは、書き込みモードによって異なります。
次の表は、Hologresのさまざまな書き込みモードを示しています。
書き込みモード
説明
Insert
デスティネーションテーブルにプライマリキーが設定されていない場合、Append-Onlyモードでテーブルにデータを書き込みます。
InsertOrIgnore
プライマリキー値がすでに存在するデータを書き込む場合、書き込もうとするデータは破棄されます。
InsertOrReplace
プライマリキー値がすでに存在するデータを書き込む場合、既存のデータが置き換えられます。書き込まれたデータがすべての列をカバーしていない場合、新しいデータにない列にはnull値が挿入されます。
InsertOrUpdate
プライマリキー値がすでに存在するデータを書き込む場合、既存のデータが更新されます。この書き込みモードには、行全体の更新と行の特定の列の更新が含まれます。書き込まれたデータがすべての列をカバーしていない場合、新しいデータにない列は更新されません。
列指向テーブルの書き込みパフォーマンスは、書き込みモードによって異なります。
プライマリキーのないデスティネーションテーブルのパフォーマンスが最も高くなります。
デスティネーションテーブルにプライマリキーがある場合、書き込みモードはパフォーマンスの高い順に次のとおりです。
InsertOrIgnore > InsertOrReplace ≥ InsertOrUpdate(行全体)> InsertOrUpdate(特定の列)。
行指向テーブルの書き込みモードは、パフォーマンスの高い順に次のとおりです。
InsertOrReplace = InsertOrUpdate(行全体)≥ InsertOrUpdate(特定の列)≥ InsertOrIgnore。
バイナリロギングが有効になっているテーブルのストレージモードは、書き込みまたは更新のパフォーマンスの高い順に次のとおりです。
行指向ストレージ > 行列ハイブリッドストレージ > 列指向ストレージ。
書き込みパフォーマンスの問題のトラブルシューティング
テーブルにデータを書き込むか、データを更新するときに書き込みパフォーマンスが低い場合は、Hologresコンソールの [監視情報] ページで CPU使用率(%) メトリックを表示して、パフォーマンスの問題を特定できます。
CPU使用率が低い。
これは、Hologresリソースが完全に使用されておらず、Hologresでパフォーマンスの問題が発生していないことを示しています。ソーステーブルからのデータ読み取りの遅延など、他の問題が発生していないか確認できます。
CPU使用率が高い。たとえば、CPUが長時間 100% で動作している。
これは、Hologresのリソース使用量が上限に達していることを示しています。次の方法を使用して、問題のトラブルシューティングを行うことができます。
基本的な最適化方法を使用して、高いリソース使用率が無効な基本設定によって引き起こされているかどうかを確認します。詳細については、このトピックの 基本的な最適化方法 をご参照ください。
基本的な最適化操作を完了した後、FlinkやData Integrationなどのデータ同期サービスを確認し、高度な最適化操作を実行して、書き込みの問題をさらに特定し、トラブルシューティングを行います。詳細については、Flinkの書き込みパフォーマンスの最適化、Data Integrationの書き込みパフォーマンスの最適化、および 高度な最適化方法 をご参照ください。
書き込みパフォーマンスがクエリの影響を受けているかどうかを確認します。書き込み操作とクエリ操作を同時に行うと、リソース使用率が高くなる可能性があります。低速クエリログを使用して、書き込み操作が実行された時点でのクエリのCPUリソース消費量を確認できます。クエリが書き込みパフォーマンスに悪影響を与える場合は、マルチインスタンス高可用性デプロイメントを設定できます。詳細については、プライマリインスタンスとセカンダリインスタンスの読み取り/書き込み分割の設定(共有ストレージ) をご参照ください。
すべての最適化操作が完了した後、書き込みパフォーマンスが期待を満たしていない場合は、Hologresインスタンスをスケールアウトできます。
基本的な最適化方法
ほとんどの場合、Hologresは高い書き込みパフォーマンスを提供できます。データを書き込むときに書き込みパフォーマンスが期待を満たしていない場合は、次の方法を使用してパフォーマンスを最適化できます。
プライベートネットワーク経由でHologresインスタンスに接続して、ネットワークオーバーヘッドを削減します。
Hologresは、仮想プライベートクラウド(VPC)、クラシックネットワーク、インターネットなど、さまざまなネットワークタイプをサポートしています。さまざまなネットワークタイプでのHologresのアプリケーションシナリオの詳細については、「インスタンス構成」トピックの ネットワーク情報 をご参照ください。特にJava Database Connectivity(JDBC)やPostgreSQLなどのアプリケーションを使用する場合は、データ書き込みのためにVPC経由でHologresインスタンスに接続することをお勧めします。インターネットはトラフィックを制限し、VPCよりも不安定です。
固定プランを使用して書き込み操作を実行します。
次の図は、HologresでのSQLステートメントの実行プロセスを示しています。詳細については、QE をご参照ください。

SQLステートメントがオンライン分析処理(OLAP)の特性に準拠している場合、Hologresは図の左側に示されている実装プロセスに従います。Hologresは、クエリ最適化ツール(QO)やクエリエンジン(QE)などのコンポーネントを使用してSQLステートメントを処理します。テーブルにデータを書き込むか、データを更新すると、テーブル全体がロックされます。
INSERT、UPDATE、DELETEなどのステートメントが同時に実行される場合、次のSQLステートメントは現在のSQLステートメントの実行が完了した後にのみ実行できます。これにより、レイテンシが増加します。SQLステートメントが固定プランの特性に準拠している場合、Hologresは図の右側に示されている実装プロセスに従います。このプロセスでは、固定プランが使用されます。QOなどのコンポーネントがなくても、固定プランを使用してクエリを簡単な方法で実行できます。行にデータを書き込むか、データを更新すると、その行のみがロックされます。これにより、クエリの同時実行性とパフォーマンスが大幅に向上します。
したがって、書き込みまたは更新のパフォーマンスを最適化するときは、固定プランを使用して書き込みまたは更新操作を実行できます。
固定プランを使用して書き込みまたは更新操作を実行する
固定プランを使用して実行できるSQLステートメントは、固定プランの特性に準拠している必要があります。次のシナリオでは、固定プランはサポートされていません。
INSERT ON CONFLICTステートメントを実行して、複数の行にデータを挿入します。ステートメントの例:INSERT INTO test_upsert(pk1, pk2, col1, col2) VALUES (1, 2, 5, 6), (2, 3, 7, 8) ON CONFLICT (pk1, pk2) DO UPDATE SET col1 = excluded.col1, col2 = excluded.col2;INSERT ON CONFLICTステートメントが部分更新のために実行され、挿入されたデータの一部の列がデスティネーションテーブルの列にマッピングされていません。デスティネーションテーブルにSERIALデータタイプの列が含まれています。
デスティネーションテーブルに
Defaultプロパティが設定されています。プライマリキーに基づいて
UPDATEまたはDELETE操作が実行されます。例:update table set col1 = ?, col2 = ? where pk1 = ? and pk2 =?;。一部の列のデータタイプは、固定プランではサポートされていません。
固定プランを使用せずにSQLステートメントを実行すると、Hologresコンソールの [監視情報] ページの
リアルタイムインポート(RPS)メトリックセクションに、ステートメントのタイプがINSERTとして表示されます(次の図を参照)。
この場合、HologresはHologres Query Engine(HQE)またはPostgreSQL Query Engine(PQE)を使用してSQLステートメントを処理します。ほとんどの場合、書き込み操作はHQEを使用して処理されます。書き込みまたは更新操作が遅い場合は、次のステートメントを実行して低速クエリログをクエリし、クエリで使用されているエンジンの種類を確認できます。エンジンの種類は engine_type パラメーターで指定されます。-- 過去 3 時間に固定プランを使用せずに実行された INSERT、UPDATE、および DELETE ステートメントをクエリします。 SELECT * FROM hologres.hg_query_log WHERE query_start >= now() - interval '3 h' AND command_tag IN ('INSERT', 'UPDATE', 'DELETE') AND ARRAY['HQE'] && engine_type ORDER BY query_start DESC LIMIT 500;HQEを使用して処理されるSQLステートメントを、固定プランの特性に準拠するソフトウェア開発キット(SDK)SQLステートメントに変更します。これにより、パフォーマンスが向上します。次の表に、固定プランの使用をサポートするために使用できるGrand Unified Configuration(GUC)パラメーターを示します。データベースレベルでパラメーターをonに設定することをお勧めします。固定プランの使用方法の詳細については、固定プランを使用してSQLステートメントの実行を高速化する をご参照ください。
シナリオ
GUC設定
説明
固定プランを使用して
INSERT ON CONFLICTステートメントを実行し、複数の行にデータを挿入します。alter database <データベース名> set hg_experimental_enable_fixed_dispatcher_for_multi_values =on;このGUCパラメーターは、データベースレベルでonに設定することをお勧めします。
固定プランを使用して、SERIALデータタイプの列にデータを書き込みます。
alter database <データベース名> set hg_experimental_enable_fixed_dispatcher_autofill_series =on;テーブルにSERIALデータタイプを指定しないことをお勧めします。このデータタイプは、書き込みパフォーマンスに悪影響を及ぼします。このGUCパラメーターは、Hologres V1.3.25以降ではデフォルトで
onに設定されています。固定プランを使用して、デフォルトのプロパティが設定されている列にデータを書き込みます。
Hologres V1.3以降では、
INSERT ON CONFLICTステートメントを実行して、デフォルトのプロパティが設定されている列にデータを書き込む場合、デフォルトで固定プランが使用されます。テーブルにデフォルトのプロパティを設定しないことをお勧めします。デフォルトのプロパティは、書き込みパフォーマンスに悪影響を及ぼします。Hologres V1.1では、デフォルトのプロパティが設定されている列のステートメントは、固定プランを使用して処理できません。Hologres V1.3以降では、デフォルトのプロパティが設定されている列のステートメントを固定プランを使用して処理できます。
固定プランを使用して、プライマリキーに基づいてUPDATE操作を実行します。
alter database <データベース名> set hg_experimental_enable_fixed_dispatcher_for_update =on;Hologres V1.3.25以降では、このGUCパラメーターはデフォルトで
onに設定されています。固定プランを使用して、プライマリキーに基づいてDELETE操作を実行します。
alter database <データベース名> set hg_experimental_enable_fixed_dispatcher_for_delete =on;Hologres V1.3.25以降では、このGUCパラメーターはデフォルトで
onに設定されています。SQLステートメントが固定プランを使用して実行される場合、Hologresコンソールの [監視情報] ページの
リアルタイムインポート(RPS)メトリックセクションに、ステートメントのタイプがSDKとして表示されます(次の図を参照)。SQLステートメントのengine_typeで指定されたエンジンの種類は、低速クエリログではSDKです。
固定プランを使用しても書き込みパフォーマンスが向上しない
固定プランを使用しても書き込みパフォーマンスが低い原因として考えられるのは次のとおりです。
固定プランベースのSDKとHQEを同時に使用して、テーブルにデータを書き込むか、データを更新します。HQEにより、テーブルがロックされます。その結果、SDKを使用したデータ書き込みはロックが解除されるまで待機する必要があり、時間がかかります。次のSQLステートメントを実行して、HQEを使用して処理されるステートメントを確認できます。ビジネス要件に基づいて、ステートメントをSDK SQLステートメントに変更します。HoloWebのクエリインサイト機能を使用して、固定プランを使用するクエリがHQEによって引き起こされたロックの解除を待機しているかどうかをすばやく確認できます。詳細については、クエリインサイト をご参照ください。
-- 過去 3 時間に固定プランを使用せずに実行された INSERT、UPDATE、および DELETE ステートメントをクエリします。 SELECT * FROM hologres.hg_query_log WHERE query_start >= now() - interval '3 h' AND command_tag IN ('INSERT', 'UPDATE', 'DELETE') AND ARRAY['HQE'] && engine_type AND table_write = '<テーブル名>' ORDER BY query_start DESC LIMIT 500;SDKを使用してデータを書き込んでいるにもかかわらず書き込みパフォーマンスが低い場合は、
CPU使用率(%)メトリックを確認します。CPU使用率が高い状態が続く場合は、インスタンスをスケールアウトします。
バイナリロギングを無効にして書き込みスループットを向上させます
Hologresバイナリログは、INSERT、UPDATE、またはDELETEステートメントの実行によって引き起こされるデータの変更(各行のデータの変更を含む)を記録します。次のサンプルコードは、バイナリロギングが有効になっているテーブルのデータを更新するために実行されるUPDATEステートメントを示しています。
update tbl set body =new_body where id='1';バイナリログは、行のすべての列のデータを記録します。バイナリログを生成するには、フィルタリングフィールドに基づいて、デスティネーションテーブルの行のすべての列でポイントクエリを実行する必要があります。この例では、
idフィールドに基づいてポイントクエリが実行されます。列指向テーブルに対するポイントクエリは、行指向テーブルで実行されるポイントクエリよりも多くのリソースを消費します。バイナリロギングが有効になっているテーブルにデータを書き込む場合、パフォーマンスの高い順にストレージモードは次のとおりです。行指向テーブル > 列指向テーブル。リアルタイム書き込み操作とオフライン書き込み操作を同時に行わないようにします
オフラインモードでデータを書き込む場合(たとえば、MaxComputeからHologresテーブルへ)、Hologresテーブルはロックされます。固定プランを使用してFlinkまたはDataWorks Data Integrationを使用してリアルタイムでHologresテーブルにデータを書き込む場合、データを挿入する行のみがロックされます。オフライン書き込み操作とリアルタイム書き込み操作がテーブルで同時に実行される場合、オフライン書き込み操作のためにテーブルがロックされます。これにより、レイテンシが増加し、リアルタイム書き込みパフォーマンスが低下します。したがって、テーブルでリアルタイム書き込み操作とオフライン書き込み操作を同時に行わないようにすることをお勧めします。
Holo ClientまたはJDBCの書き込みパフォーマンスの最適化
Holo ClientやJDBCなどのクライアントを使用してデータを書き込む場合、次の方法を使用して書き込みパフォーマンスを向上させることができます。
バッチ書き込み操作を実行します
クライアントを使用してデータを書き込む場合、バッチ書き込み操作は単一書き込み操作よりも高いスループットを実現します。バッチ書き込み操作は、書き込みパフォーマンスを向上させます。
Holo Clientを使用する場合、Hologresは自動的にバッチ書き込み操作を実行します。Holo Clientのデフォルト設定を使用することをお勧めします。詳細については、Holo Client をご参照ください。
JDBCを使用する場合は、
WriteBatchedInsertsパラメーターをtrueに設定して、バッチ書き込み操作を実装します。次のサンプルコードは、バッチ書き込み操作を実装するために使用されるコマンドを示しています。JDBCの詳細については、JDBC をご参照ください。jdbc:postgresql://{ENDPOINT}:{PORT}/{DBNAME}?ApplicationName={APPLICATION_NAME}&reWriteBatchedInserts=true
次の例は、バッチ書き込み操作をサポートしていない2つの個別のSQLステートメントを、バッチ書き込み操作をサポートする1つのSQLステートメントに変更する方法を示しています。
-- バッチ書き込み操作をサポートしていない 2 つの SQL ステートメント: insert into data_t values (1, 2, 3); insert into data_t values (2, 3, 4); -- バッチ書き込み操作をサポートする SQL ステートメント: insert into data_t values (1, 2, 3), (4, 5, 6); -- バッチ書き込み操作をサポートする別の SQL ステートメント: insert into data_t select unnest(ARRAY[1, 4]::int[]), unnest(ARRAY[2, 5]::int[]), unnest(ARRAY[3, 6]::int[]);プリペアドステートメントを実行してデータを書き込みます
HologresはPostgreSQLエコシステムと互換性があり、PostgreSQLの拡張プロトコル上に構築されています。Hologresでは、プリペアドステートメントを実行してサーバーのSQLコンパイル結果をキャッシュできます。これにより、フロントエンド(FE)やQOなどのコンポーネントによるオーバーヘッドが削減され、書き込みパフォーマンスが向上します。
JDBCまたはHolo Clientを使用してプリペアドステートメントを実行してデータを書き込む方法の詳細については、JDBC をご参照ください。
Flinkの書き込みパフォーマンスの最適化
次の項目に注意してください。
バイナリログソーステーブル
デプロイメントにSMALLINTまたはその他のサポートされていないデータタイプの列を含むテーブルを指定した場合、これらの列が消費用に指定されていなくても、システムはデプロイメントを実行できない可能性があります。VVR-6.0.3-Flink-1.15以降のRealtime Compute for Apache Flinkは、JDBCモードでHologresバイナリログを消費できます。このモードでは、複数のデータタイプの列を消費できます。
バイナリロギングが有効になっているテーブルには、行指向ストレージモードを指定することをお勧めします。バイナリロギングが有効になっているテーブルに列指向ストレージモードを指定すると、より多くのリソースが必要になり、書き込みパフォーマンスに悪影響を及ぼします。
ディメンションテーブル
ディメンションテーブルは、行指向ストレージまたは行列ハイブリッドストレージを使用する必要があります。列指向テーブルは、ポイントクエリで大きなオーバーヘッドが発生します。
行指向テーブルを作成する場合は、プライマリキーを設定する必要があります。プライマリキーがクラスタリングキーとしても使用されている場合、パフォーマンスが向上します。
Hologresディメンションテーブルを別のテーブルと結合する場合は、ON句でディメンションテーブルのプライマリキーのすべてのフィールドを指定する必要があります。
結果テーブル
Hologresでワイドテーブルをマージするか、ワイドテーブルの部分データを更新する場合は、ワイドテーブルにプライマリキーを設定する必要があります。プライマリキー列は、
InsertOrUpdateモードの各結果テーブルで宣言し、プライマリキー値を書き込む必要があります。ignoredeleteパラメーターは、各結果テーブルでtrueに設定する必要があります。これにより、リトラクションメッセージが削除リクエストを生成するのを防ぎます。ワイドテーブルが列指向テーブルであり、1秒あたり多数のリクエストが開始される場合、CPU使用率が高くなります。テーブルのフィールドの
辞書エンコーディングを無効にすることをお勧めします。結果テーブルにプライマリキーが設定されている場合は、
segment_keyプロパティを設定することをお勧めします。これにより、データを書き込むか更新するときに、データが配置されている基になるファイルをすばやく見つけることができます。タイムスタンプまたは日付を示す列にsegment_keyプロパティを設定し、書き込み時間と強い相関関係のあるデータを列に書き込むことをお勧めします。
Flinkパラメーター設定の推奨事項
ほとんどの場合、Hologresコネクターのパラメーターのデフォルト値は最適値です。次のいずれかの問題が発生した場合は、ビジネス要件に基づいてパラメーターの値を変更できます。
バイナリログ消費のレイテンシが高い
デフォルトでは、
binlogBatchReadSizeパラメーターで指定された読み取り行数は 100 です。バイトサイズパラメーターで指定された行のデータサイズが小さい場合は、binlogBatchReadSizeパラメーターの値を増やして消費レイテンシを削減できます。ディメンションテーブルに対するポイントクエリの低いパフォーマンス
asyncパラメーターをtrueに設定して、非同期モードを有効にします。非同期モードでは、複数のリクエストとレスポンスが同時に処理されます。これにより、クエリが高速化され、クエリのスループットが向上します。ただし、非同期モードでは、リクエストは絶対的な順序で処理されません。ディメンションテーブルに大量のデータが含まれており、更新頻度が低い場合は、ディメンションテーブルキャッシュを使用してクエリのパフォーマンスを最適化することをお勧めします。
cache = 'LRU'設定を追加し、ビジネス要件に基づいてcacheSizeパラメーターをデフォルト値 10000 より大きい値に設定します。
接続が不十分
デフォルトでは、
connectionsはJDBCを使用して実装されます。多数のFlinkデプロイメントにより、Hologresに割り当てられた接続数が不十分になる可能性があります。この場合、connectionPoolNameパラメーターを設定して、同じTaskManagerの同じプールに割り当てられたテーブル間で接続を共有できます。
推奨されるデプロイメント開発方法
Flink SQLは、DataStreamよりも保守性と移植性に優れています。したがって、Flink SQLを使用してデプロイメントを実装することをお勧めします。DataStreamが必要な場合は、Hologres DataStreamコネクターを使用することをお勧めします。詳細については、Hologres コネクタ をご参照ください。カスタムDataStreamコネクターを使用する場合は、JDBCではなくHolo Clientを使用することをお勧めします。デプロイメント開発方法は、推奨優先順位の高い順に次のとおりです。
Flink SQL > Flink DataStream(コネクター)> Flink DataStream(Holo Client)> Flink DataStream(JDBC)。書き込みパフォーマンス低下の診断
ほとんどの場合、書き込みパフォーマンスの低下は、Flinkデプロイメントの他のステップが原因である可能性があります。Flinkデプロイメントを複数のノードに分割し、Flinkデプロイメントでバックプレッシャーを確認できます。データソースまたは一部の複雑な計算ノードでバックプレッシャーが発生した場合、結果テーブルへの書き込み操作は遅くなります。この場合、Flinkで問題が発生しています。
HologresインスタンスのCPU使用率が長時間 100% などの高い値であり、書き込みレイテンシが高い場合は、Hologresで問題が発生しています。
その他の一般的な例外とトラブルシューティング方法の詳細については、BlinkとFlinkの問題に関するFAQ をご参照ください。
Data Integrationの書き込みパフォーマンスの最適化
スレッド数と接続数
非スクリプトモードでのData Integrationへの接続数は、スレッドあたり 3 です。スクリプトモードでは、
maxConnectionCountパラメーターを使用してタスクの合計接続数を設定するか、insertThreadCountパラメーターを使用して単一スレッドの接続数を設定できます。ほとんどの場合、スレッド数と接続数のデフォルト値で最適な書き込みパフォーマンスを実現できます。ビジネス要件に基づいて設定を変更できます。専用リソースグループ
Data Integrationのほとんどのジョブは、専用リソースグループで処理されます。したがって、専用リソースグループの仕様によって、ジョブのピークパフォーマンスが決まります。高パフォーマンスを確保するために、専用リソースグループの 1 つのCPUコアを 1 つのスレッドに割り当てることをお勧めします。リソースグループの仕様が小さいにもかかわらず同時実行ジョブの数が多い場合、Java仮想マシン(JVM)メモリが不足する可能性があります。専用リソースグループの帯域幅が使い果たされた場合、ジョブの書き込みパフォーマンスにも影響します。この場合、ジョブを小さなジョブに分割し、ジョブを異なるリソースグループに割り当てることをお勧めします。Data Integrationの専用リソースグループの仕様とメトリックの詳細については、「Data Integrationの専用リソースグループの課金(サブスクリプション)」トピックの パフォーマンスメトリック をご参照ください。
書き込みパフォーマンス低下の診断
Data Integrationを使用してHologresにデータを書き込む場合、ソースで消費される待機時間がデスティネーションで消費される待機時間よりも長い場合、ソースで問題が発生しています。
HologresインスタンスのCPU使用率が長時間 100% などの高い値であり、書き込みレイテンシが高い場合は、Hologresで問題が発生しています。
高度な最適化方法
このトピックの前のセクションで説明されている最適化方法を使用して書き込みパフォーマンスを最適化した後、ほとんどの場合、書き込みパフォーマンスを向上させることができます。書き込みパフォーマンスが期待を満たしていない場合は、インデックス設定やデータ分散など、書き込みパフォーマンスに影響を与える他の要因を確認します。このセクションでは、基本的な最適化方法に基づいて書き込みパフォーマンスを向上させる高度な最適化方法を紹介します。高度な最適化方法は、Hologresの技術的原則に基づいてパフォーマンスを最適化するために使用されます。
データの不均一な分散
データが不均一に分散されているか、指定された分散キーが無効な場合、Hologresインスタンスの計算リソースを均等に分散できません。これにより、リソースの使用効率が低下し、書き込みパフォーマンスに影響します。データ分散の問題のトラブルシューティングと解決策の詳細については、ワーカー間のシャード割り当てのクエリ をご参照ください。
セグメントキーの無効な設定
テーブルに指定されたセグメントキーが不適切な列指向テーブルにデータを書き込むと、書き込みパフォーマンスに影響します。テーブルのデータ量が増加するにつれて、書き込みパフォーマンスは低下します。セグメントキーは、基になるファイルをセグメント化するために使用されます。テーブルにデータを書き込むか、データを更新すると、Hologresはプライマリキーに基づいて古いデータをクエリします。列指向テーブルの場合、Hologresはセグメントキーに基づいて基になるファイルを見つけます。列指向テーブルにセグメントキーが指定されていないか無効なセグメントキーが指定されている場合、またはセグメントキーを構成する列と時間の相関関係が強くない場合(たとえば、セグメントキーを構成する列のデータが順序付けられていない場合)、データクエリ中に多数のファイルをスキャンする必要があります。この場合、多数のI/O操作が実行され、多数のCPUリソースが消費されます。その結果、書き込みパフォーマンスが低下し、インスタンスの負荷が増加します。Hologresコンソールの [監視情報] ページの
I/Oスループットメトリックセクションでは、進行中のジョブに主に書き込み操作が含まれている場合でも、読み取りメトリックの値が高くなります。したがって、TIMESTAMPまたはDATEデータタイプの列をセグメントキーとして指定し、挿入するデータがデータの書き込み時間と強い相関関係があることを確認することをお勧めします。
不適切なクラスタリングキーの設定
テーブルにプライマリキーが指定されている場合、テーブルにデータを書き込むか、データを更新すると、Hologresはプライマリキーに基づいてテーブル内の古いデータをクエリします。
行指向テーブルの場合、クラスタリングキーがプライマリキーと一致しない場合、Hologresはプライマリキーとクラスタリングキーに基づいて個別にデータをクエリします。これにより、書き込みレイテンシが増加します。したがって、行指向テーブルには、クラスタリングキーとプライマリキーとして同じ列を設定することをお勧めします。
列指向テーブルの場合、クラスタリングキーの設定は主にクエリのパフォーマンスに影響しますが、書き込みパフォーマンスには影響しません。