.update table コマンド
.update table
コマンドは、レコードをアトミックに削除および追加することで、指定されたテーブルのデータ更新を実行します。
警告
このコマンドは回復できません。
Note
update ポリシーのソースであるテーブルで .update table
コマンドを実行すると.update table
コマンドによって、変更されるテーブルが更新ポリシー ソースである更新ポリシーがトリガーされます。
1 つのコマンドで最大 500 万レコードを削除できます。
アクセス許可
このコマンドを実行するには、少なくとも Table 管理者 アクセス許可が必要です。
構文
構文規則について詳しく知る。
.update
[async]
table
TableName delete
DeleteIdentifier append
AppendIdentifier [with
(
propertyName =
propertyValue )
]<|
let
DeleteIdentifier=
DeletePredicate;
let
AppendIdentifier=
AppendPredicate;
パラメーター
件名 | タイプ | Required | 説明 |
---|---|---|---|
async | string |
指定した場合、コマンドが非同期モードで実行されることを示します。 | |
TableName | string |
✔️ | 更新するテーブルの名前。 |
DeleteIdentifier | string |
✔️ | 更新されたテーブルに適用される削除述語を指定するために使用される識別子名。 |
DeletePredicate | string |
✔️ | 削除するデータとして結果が使用されるクエリのテキスト。 述語には、論理的な削除述語と同じ 制限があります。 |
AppendIdentifier | string |
✔️ | 更新されたテーブルに適用される追加述語を指定するために使用される識別子名。 |
AppendPredicate | string |
✔️ | 追加するデータとして結果が使用されるクエリのテキスト。 |
重要
- 削除述語と追加述語の両方で、リモート エンティティ、クロス db エンティティ、クロスクラスター エンティティを使用することはできません。 述語は外部テーブルを参照することも、
externaldata
演算子を使用することもできません。 - 追加クエリと削除クエリは、決定論的な結果を生成することが期待されます。 非決定的なクエリは、予期しない結果につながる可能性があります。 クエリは、複数回実行された場合に同じデータを返す場合にのみ決定論的です。
- クエリは、
update
実行内で複数回実行される場合があります。 中間クエリの結果に一貫性がない場合は、update コマンドによって予期しない結果が生成される可能性があります。
サポートされるプロパティ
名前 | 種類 | 説明 |
---|---|---|
whatif | [bool] | true 場合は、レコードを追加/削除せずに、すべてのシャードで追加/削除されるレコードの数を返します。 既定値は、false です。 |
分散 | [bool] | true 場合、コマンドはクエリを並列で実行しているすべてのノードから取り込みます。 既定値は false です。 パフォーマンス ヒントを参照してください。 |
重要
データを削除または追加する前に述語を検証するために、更新を実行する前に、最初に whatif
モードで実行することをお勧めします。
返品
コマンドの結果は、各レコードが新しいデータで作成されたか、レコードが削除された 拡張 を表すテーブルです。
名前 | 種類 | 説明 |
---|---|---|
テーブル | string |
エクステントが作成または削除されたテーブル。 |
アクション | string |
エクステントに対して実行されるアクションに応じて または 削除 を作成します。 |
ExtentId | guid |
コマンドによって作成または削除されたエクステントの一意識別子。 |
RowCount | long |
コマンドによって指定されたエクステント内で作成または削除された行の数。 |
.update table
ビューと具体化されたビューを選択する
.update table
コマンドまたは具体化されたビューのいずれかを使用してテーブル内で同じ目標を達成できるシナリオがあります。 たとえば、マテリアライズド ビューを使用して各レコードの最新バージョンを保持したり、新しいバージョンが使用可能になったときに更新を使用してレコードを更新したりできます。
使用する方法を決定するには、次のガイドラインに従います。
- マテリアライズド ビューで更新パターンがサポートされていない場合は、update コマンドを使用します。
- ソース テーブルに取り込み量が多く、更新プログラムが少ない場合は、update コマンドを使用するとパフォーマンスが高くなり、具体化されたビューよりもキャッシュまたはストレージの消費量が少なくなる可能性があります。 これは、具体化されたビューで取り込まれたすべてのデータを再処理する必要があるためです。これは、追加述語または削除述語に基づいて更新する個々のレコードを識別するよりも効率的ではありません。
- 具体化されたビューは、フル マネージド ソリューションです。 具体化されたビューは 1 回定義され マテリアライズはシステムによってバックグラウンドで行われます。 更新コマンドには、更新が行われるたびに明示的に更新コマンドを実行する調整されたプロセス ( Azure Data Factory、 Logic Apps、 Power Automate など) が必要です。 具体化されたビューがユース ケースに十分に機能する場合、具体化されたビューを使用すると、管理とメンテナンスが少なくなります。
パフォーマンスに関するヒント
- データの取り込みはリソースを大量に消費する操作であり、クエリの実行など、クラスターでの同時実行アクティビティに影響する可能性があります。 多くの
.update
コマンドを一度に実行し、 分散 プロパティを集中的に使用するという、リソースを集中的に消費するアクションは避けてください。 - 操作ごとに追加データを 1 GB 未満に制限します。 必要に応じて、複数の更新コマンドを使用します。
- クエリによって生成されるデータの量が多く、1 GB を超え、シリアル化を必要としない場合にのみ、
distributed
フラグをtrue
に設定します。複数のノードが並列で出力を生成できます。 クエリ結果が小さい場合は、このフラグを使用しないでください。これは、多数の小さなデータ シャードを不必要に生成する可能性があるためです。
例
この例では、次の表を使用します。
.set-or-replace Employees <|
range i from 1 to 100 step 1
| project Id=i
| extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
| extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])
次のコマンドを実行すると、100 個のレコードを含むテーブルが作成されます。
ID | コード | 色 |
---|---|---|
1 | 社員 | 青 |
2 | カスタマー | グレー |
3 | 社員 | [赤] |
4 | カスタマー | 青 |
5 | 社員 | グレー |
6 | カスタマー | 赤 |
6 | 社員 | 青 |
1 行の 1 つの列を更新する
次の例では、1 つの行の 1 つの列を更新します。
.update table Employees delete D append A with(whatif=true) <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
whatif
が true に設定されていることに注意してください。 このクエリの後、テーブルは変更されませんが、コマンドは、1 つの行が削除されたエクステントと 1 行の新しいエクステントがあることを返します。
次のコマンドは、実際に更新を実行します。
.update table Employees delete D append A <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
複数の行の 1 つの列を更新する
次の例では、1 つの列Color
の値がgreenblueの行の値に更新されます。
.update table Employees delete D append A <|
let D = Employees
| where Code=="Employee"
| where Color=="Blue";
let A = D
| extend Color="Green";
ここでは、追加述語の定義で 削除識別子 を再利用しました。
複数の行で複数の列を更新する
次の例では、すべての行の複数の列を灰色で更新します。
.update table Employees delete D append A <|
let D = Employees
| where Color=="Gray";
let A = D
| extend Code=strcat("ex-", Code)
| extend Color="";
別のテーブルを使用して行を更新する (参照値)
この例では、最初の手順として次のマッピング テーブルを作成します。
.set-or-replace ColorMapping <|
datatable(OldColor:string, NewColor:string)[
"Red", "Pink",
"Blue", "Purple",
"Gray", "LightGray",
"Orange", "Yellow",
"Green", "AppleGreen"
]
このマッピング テーブルは、元のテーブルの一部の色を更新するために使用されます。
.update table Employees delete D append A <|
let D = Employees
| where Code=="Customer";
let A = D
| lookup ColorMapping on $left.Color==$right.OldColor
| project Id, Code, Color=NewColor
データテーブルを使用して行を更新する
更新する値がテーブルに格納されずにわかっている場合があり、 datatable 演算子 が役立つことがあります。
.update table Employees delete D append A <|
let A = datatable(Id:long, Code:string, Color:string)[
1, "Customer", "Purple",
2, "Customer", "Magenta",
3, "Customer", "Turquoise",
];
let D = Employees
| join kind=leftsemi A on Id
| where true;
ステージング テーブルを使用して行を更新する
一般的なパターンは、メイン テーブルを更新する前に、まずステージング テーブルにデータを格納することです。
最初のコマンドでは、ステージング テーブルが作成されます。
.set-or-replace MyStagingTable <|
range i from 70 to 130 step 5
| project Id=i
| extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
| extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])
次のコマンドは、メイン テーブルをステージング テーブル内のデータで更新します。
.update table Employees delete D append A <|
let A = MyStagingTable;
let D = Employees
| join kind=leftsemi MyStagingTable on Id
| where true;
ステージング テーブル内の一部のレコードはメイン テーブルに存在しませんでした (つまり、 Id>100
がありました)、メイン テーブルにまだ挿入されていました (アップサート動作)。
複合キー
最初のコマンドは、複合キーを含むテーブルを作成します。
.set-or-replace VersionedArticle <|
datatable(ArticleId:string, Version:int, Detail:string)[
"A", 1, "Early version",
"B", 1, "News about mobiles",
"C", 1, "Opinion article",
"B", 2, "Revision about brand X",
"B", 3, "Revision about brand Y",
"C", 2, "Fact check"
]
次のコマンドは、展開された構文を使用して特定のレコードを更新します。
.update table VersionedArticle delete D append A <|
let D = VersionedArticle
| where ArticleId=="B"
| where Version==3;
let A = VersionedArticle
| where ArticleId=="B"
| where Version==3
| extend Detail = "Revision about brand Z";