完全および増分ストレージおよび処理の統合アーキテクチャをサポートするために、Deltaテーブルは統一されたテーブルデータ形式を提供します。 デルタテーブルは、MaxCompute標準テーブルのすべての機能をサポートしており、タイムトラベルクエリやUPSERT操作などの増分処理を伴う新しいシナリオに適しています。 このトピックでは、Deltaテーブルのテーブルデータ形式について説明します。
デルタテーブルのキーテーブルプロパティ
プライマリキーを持つデルタテーブルのみがサポートされています。 CREATE TABLEステートメントを実行して、主キーを持つDeltaテーブルを作成するには、ステートメントでprimary keyおよびtblproperties ("transactional"="true") のキープロパティを設定します。
primary key: このプロパティを設定すると、UPSERTモードで効率的にデータをインポートできます。 スナップショットベースのクエリまたはコンパクション操作が実行された後、同じ主キーを持つ複数行のレコードが1行のデータにマージされ、最新のステータスのみが保持されます。
tblproperties ("transactional"="true"): トランザクションプロパティは、スナップショットの分離と同時読み取りおよび書き込み操作の制御を保証するためのアトミック性、一貫性、分離、および耐久性 (ACID) トランザクション特性を示します。 トランザクションプロパティフィールドは、テーブルに書き込まれるデータの各行に追加されます。 たとえば、タイムスタンプフィールドは、タイムトラベルクエリで必要なデータバージョンのレコードを取得するために、データの各行に追加されます。
その他の重要なテーブルプロパティを設定することもできます。 たとえば、write.bucket.numプロパティを設定して書き込み並列度を指定し、acid.data.retain.hoursプロパティを設定して履歴データの有効クエリ時間範囲を指定できます。 テーブルのプロパティの詳細については、「デルタテーブルのパラメーター」をご参照ください。
デルタテーブルでサポートされているファイル形式
デルタテーブルは複数のファイル形式をサポートしているため、完全な読み書きシナリオとほぼリアルタイムの増分読み書きシナリオで高い効率を確保できます。 サポートされているファイル形式には、ベースファイルとデルタファイルがあります。

基本ファイルとデルタファイルの説明:
デルタファイル: トランザクションがコミットされ、データがUPDATEまたはDELETEモードで書き込まれるたびに生成されるファイルの種類。 デルタファイルは、ほぼリアルタイムの増分読み取りおよび書き込み要件を満たすために、データの各行の中間履歴ステータスを格納します。 クラスタリング操作が実行されるたびに、デルタファイルも生成される。 デルタファイルは、列指向のストレージと圧縮を使用します。
ベースファイル: デルタファイルに対してコンパクション操作が実行された後に生成されるファイルの種類。 ベースファイルでは、中間履歴ステータスが削除され、同じ主キーを持つレコードに対して1行のデータのみが保持されます。 ベースファイルは、列指向のストレージと圧縮を使用して、効率的なフルデータクエリをサポートします。
トランザクションテーブル2.0テーブル内のデータをクエリするときは、次の項目に注意してください。
MaxComputeは、スナップショットベースのクエリが実行されるたびに、最新のベースファイルを検索します。 次に、MaxComputeは、ベースファイルの生成後にデータが書き込まれるすべてのデルタファイルを検索し、デルタファイルのデータをマージします。 したがって、クエリモードはMerge On Read (MOR) です。 詳細については、「タイムトラベルクエリと増分クエリ」をご参照ください。
すべてのデータファイルは、主キー列の値に基づいてソートされます。 これにより、マージ効率が効果的に向上し、データスキッピングクエリの最適化に役立ちます。 データファイルは、列指向のストレージと圧縮を使用します。 これにより、保存データ量を効果的に削減し、コストを節約し、I/O効率を向上させることができます。
バケット
読み書きの効率をさらに向上させるために、Deltaテーブルを使用すると、バケットインデックス列に基づいてデータを分割して保存できます。 デフォルトでは、バケットインデックス列は主キー列のデータを再使用します。 write.bucket.numプロパティを設定して、データが書き込まれるバケットの数を指定できます。 このようにして、同じテーブルまたはパーティションに書き込まれたデータは、主キー列の値に基づいて分割されます。 同じプライマリキーを持つレコードは、同じバケットに格納されます。
ほぼリアルタイムの増分インポートは、バケット数の水平スケーリングに基づいて高い同時実行性をサポートします。 したがって、データ書き込みトラフィックとテーブルデータの合計ストレージサイズに基づいて、妥当な数のバケットを評価して指定する必要があります。 バケットの数が多すぎると、過剰な数の小さなファイルが生成される可能性がある。 これは、データの読み書き効率とストレージの安定性に影響します。 バケットの数が少なすぎると、高トラフィックと高速でほぼリアルタイムのインポートの要件が満たされない可能性があります。
この機能は、データクエリ効率の向上にも役立ちます。 フィルタ条件がバケットインデックス列に適用される場合、バケットの枝刈りを効率的に実行して、クエリされるデータ量を減らすことができます。 GROUP BY句またはJOIN操作のキー列がバケットインデックス列と同じ場合は、ローカル結合またはGROUP BY操作を直接実行できます。 これにより、シャッフルの削減、コンピューティングリソースの節約、クエリのパフォーマンスの向上に役立ちます。
小さなファイルのクラスタリングやコンパクションなどのデータ最適化管理操作をバケットに基づいて並列に実行することで、実行効率を向上させ、処理時間を短縮できます。
レコードタイプ
UPSERTおよびDELETEタイプのデータレコードのみを書き込み、格納できます。 UPSERTタイプには、INSERTとUPDATEという2つの暗黙のセマンティクスが含まれます。 レコードが以前に存在しない場合、レコードタイプはINSERTです。 レコードが既に存在する場合、レコードタイプはUPDATEです。