メインコンテンツまでスキップ

ユニークキーモデルでのデータ更新

この文書では、様々なロード方法を使用してDoris unique keyモデルのデータを更新する方法を紹介します。

全行更新

Stream Load、Broker Load、Routine Load、Insert Intoなど、Dorisがサポートするメソッドを使用してunique keyモデルにデータをロードする際、既存のプライマリキーデータ行が存在しない場合は新しいデータが挿入されます。既存のプライマリキーデータ行が存在する場合は更新されます。これは、Doris unique keyモデルでのロード操作が「upsert」モードで動作することを意味します。既存レコードを更新するプロセスはデフォルトで新しいレコードをロードするのと同じであるため、詳細についてはデータロードドキュメントを参照してください。

部分列更新

部分列更新では、すべてのフィールドを変更することなく、テーブル内の特定のフィールドを更新できます。この操作を実行するためにアップデート文を使用できますが、これは通常、行全体を読み取り、目的のフィールドを更新し、書き戻すことを含みます。この読み書きトランザクションは時間がかかり、大規模なデータ書き込みには適していません。Dorisは、unique keyモデルロード更新で部分列データを直接挿入または更新する機能を提供し、最初に行全体を読み取る必要性を回避することで、更新効率を大幅に向上させます。

Note
  1. バージョン2.0では、Unique KeyのMerge-on-Write実装でのみ部分列更新がサポートされます。
  2. バージョン2.0.2以降、INSERT INTOを使用した部分列更新がサポートされます。
  3. 同期マテリアライズドビューを持つテーブルでは部分列更新はサポートされません。
  4. スキーマ変更を実行中のテーブルでは部分列更新は許可されません。

適用シナリオ

  • リアルタイム動的列更新:テーブル内の特定フィールドの頻繁な更新が必要。例えば、広告/推薦システムでのリアルタイム分析と意思決定のために、ユーザータグテーブルで最新のユーザー行動に関連するフィールドを更新する場合。
  • 複数のソーステーブルを1つの大きなワイドテーブルにマージする。
  • データ修正。

使用例

Dorisに注文テーブルorder_tblがあり、注文idがKey列、注文ステータスと注文金額がValue列であると仮定します。データステータスは以下の通りです:

Order idOrder AmountOrder Status
1100Pending Payment
+----------+--------------+--------------+
| order_id | order_amount | order_status |
+----------+--------------+--------------+
| 1 | 100 | Pending Payment |
+----------+--------------+--------------+
1 row in set (0.01 sec)

ユーザーが支払いをクリックした後、Dorisシステムはorder id '1'の注文の注文ステータスを'Pending Shipment'に変更する必要があります。

Loadメソッドを使用した部分列更新

StreamLoad/BrokerLoad/RoutineLoad

以下のCSVファイルを準備してください:

1,Pending Shipment

ロード時に以下のヘッダーを追加してください:

partial_columns:true

columnsに読み込む列を指定します(すべてのキー列を含める必要があります)。以下はStream Loadの例です:

curl --location-trusted -u root: -H "partial_columns:true" -H "column_separator:," -H "columns:order_id,order_status" -T /tmp/update.csv http://127.0.0.1:8030/api/db1/order_tbl/_stream_load

INSERT INTO

すべてのデータモデルにおいて、部分的な列が指定された場合のINSERT INTOのデフォルト動作は、行全体を書き込むことです。誤用を防ぐため、Merge-on-Write実装では、INSERT INTOはデフォルトで行全体のUPSERTのセマンティクスを維持します。部分的な列の更新を有効にするには、次のセッション変数を設定してください:

SET enable_unique_key_partial_update=true;
INSERT INTO order_tbl (order_id, order_status) VALUES (1, 'Pending Shipment');

セッション変数enable_insert_strictはデフォルトでtrueに設定されており、デフォルトでストリクトモードが有効になっていることに注意してください。ストリクトモードでは、部分列更新において存在しないキーの更新は許可されません。部分列更新のinsert文を使用して存在しないキーを挿入するには、enable_unique_key_partial_updateをtrueに、enable_insert_strictをfalseに設定してください。

Flink Connector

Flink Connectorを使用する場合は、以下の設定を追加してください:

'sink.properties.partial_columns' = 'true',

sink.properties.columnに読み込む列を指定してください(すべてのキー列を含める必要があります)。

更新結果

更新後の結果は以下の通りです:

+----------+--------------+--------------+
| order_id | order_amount | order_status |
+----------+--------------+--------------+
| 1 | 100 | Pending Shipment |
+----------+--------------+--------------+
1 row in set (0.01 sec)

使用上の注意

Merge-on-Write実装は最適なクエリパフォーマンスを確保するために、書き込み時にデータの行全体を完成させる必要があるため、部分的な列更新に使用すると部分ロードのパフォーマンスが低下する可能性があります。

パフォーマンス最適化の提案:

  • NVMe搭載のSSDまたは高速SSDクラウドディスクを使用してください。データの完成時に大量の履歴データを読み取るため、高い読み取りIOPSとスループットが発生します。
  • 行ストレージを有効にすることで、データ完成時に発生するIOPSを削減し、ロードパフォーマンスを大幅に向上させることができます。テーブル作成時に以下のプロパティを設定して行ストレージを有効にしてください:
"store_row_column" = "true"

現在、同じバッチデータ書き込みタスク(ロードタスクまたはINSERT INTOのいずれか)内のすべての行は、同じカラムのみを更新できます。異なるカラムでデータを更新するには、異なるバッチで書き込みを行ってください。

将来のバージョンでは、柔軟なカラム更新をサポートし、同じバッチロード内で行ごとに異なるカラムを更新できるようになります。