Partilhar via


Comando .update table (pré-visualização)

O .update table comando efetua atualizações de dados numa tabela especificada ao eliminar e acrescentar registos atomicamente.

Aviso

Este comando é irrecuperável.

Nota

Quando executa o .update table comando numa tabela que é a origem de uma política de atualização, o comando aciona .update table estas políticas de atualização para as quais a tabela que está a ser modificada é a origem da política de atualização.

Pode eliminar até 5 milhões de registos num único comando.

Permissões

Tem de ter, pelo menos, permissões de Administração tabela para executar este comando.

Syntax

Existem duas opções de sintaxe, Sintaxe simplificada e Sintaxe expandida.

Saiba mais sobre as convenções de sintaxe.

Sintaxe expandida

A sintaxe expandida oferece a flexibilidade para definir uma consulta para eliminar linhas e uma consulta diferente para acrescentar linhas:

.updatetableTableNamedeleteDeleteIdentifierappendAppendIdentifier [with(propertyName=propertyValue)] <|
letDeleteIdentifier=EliminarPredicar;
letAppendIdentifier=AcrescentarPredicar;

Parâmetros para sintaxe expandida

Nome Tipo Necessário Descrição
TableName string ✔️ O nome da tabela a atualizar.
DeleteIdentifier string ✔️ O nome do identificador utilizado para especificar o predicado de eliminação aplicado à tabela atualizada.
EliminarPredicar string ✔️ O texto de uma consulta cujos resultados são utilizados como dados a eliminar. O predicado eliminar tem de incluir, pelo menos, um where operador e só pode utilizar os seguintes operadores: extend, where, projectjoin e lookup.
AppendIdentifier string ✔️ O nome do identificador utilizado para especificar o predicado de acréscimo aplicado à tabela atualizada.
AcrescentarPredicar string ✔️ O texto de uma consulta cujos resultados são utilizados como dados a acrescentar.

Importante

  • Tanto os predicados de eliminação como de acréscimo não podem utilizar entidades remotas, entre bds e entidades entre clusters. Os predicados não podem referenciar uma tabela externa nem utilizar o externaldata operador .
  • Espera-se que as consultas de acréscimo e eliminação produzam resultados deterministas. As consultas não administrativas podem originar resultados inesperados. Uma consulta é determinista se e apenas se devolver os mesmos dados se forem executados várias vezes.
  • As consultas podem ser executadas mais do que uma vez na update execução. Se os resultados da consulta intermédia forem inconsistentes, o comando update pode produzir resultados inesperados.

Sintaxe simplificada

A sintaxe simplificada requer uma consulta de acréscimo, bem como uma chave. A chave é uma coluna na tabela que representa valores exclusivos na tabela. Esta coluna é utilizada para definir que linhas devem ser eliminadas da tabela. É efetuada uma associação entre a tabela original e a consulta de acréscimo, para identificar linhas que concordam com o respetivo valor em relação a esta coluna.

.updatetableTableName on IDColumnName [with(propertyName=propertyValue)] <|
appendQuery

Parâmetros para sintaxe simplificada

Nome Tipo Necessário Descrição
TableName string ✔️ O nome da tabela a atualizar.
IDColumnName string ✔️ O nome da coluna que identifica as linhas. A coluna tem de estar presente na tabela e em appendQuery.
appendQuery string ✔️ O texto de uma consulta ou de um comando de gestão cujos resultados são utilizados como dados para acrescentar. O esquema da consulta tem de ser o mesmo que o esquema da tabela.

Importante

  • A consulta de acréscimo não pode utilizar entidades remotas, entidades entre bds e entre clusters, referenciar uma tabela externa ou utilizar o externaldata operador .
  • Espera-se que a consulta de acréscimo produza resultados deterministas. As consultas não administrativas podem originar resultados inesperados. Uma consulta é determinista se e apenas se devolver os mesmos dados se forem executados várias vezes.
  • As consultas podem ser executadas mais do que uma vez na update execução. Se os resultados da consulta intermédia forem inconsistentes, o comando update pode produzir resultados inesperados.

Propriedades suportadas

Nome Tipo Description
whatif bool Se true, devolve o número de registos que serão acrescentados/eliminados em cada partição horizontal, sem acrescentar/eliminar quaisquer registos. A predefinição é false.

Importante

Recomendamos que execute primeiro o whatif modo antes de executar a atualização para validar os predicados antes de eliminar ou acrescentar dados.

Devoluções

O resultado do comando é uma tabela em que cada registo representa uma extensão que foi criada com novos dados ou que teve registos eliminados.

Nome Tipo Description
Tabela string A tabela na qual a extensão foi criada ou eliminada.
Ação string Criar ou Eliminar consoante a ação executada na extensão.
ExtentId guid O identificador exclusivo da extensão que foi criada ou eliminada pelo comando .
Contagem de Linhas long O número de linhas criadas ou eliminadas na extensão especificada pelo comando .

Escolher entre .update table vistas materializadas e

Existem cenários em que pode utilizar o .update table comando ou uma vista materializada para alcançar o mesmo objetivo numa tabela. Por exemplo, uma vista materializada pode ser utilizada para manter a versão mais recente de cada registo ou uma atualização pode ser utilizada para atualizar registos quando uma nova versão está disponível.

Utilize as seguintes diretrizes para decidir qual o método a utilizar:

  • Se o padrão de atualização não for suportado por vistas materializadas, utilize o comando update.
  • Se a tabela de origem tiver um volume de ingestão elevado, mas apenas algumas atualizações, a utilização do comando update pode ser mais eficaz e consumir menos cache ou armazenamento do que as vistas materializadas. Isto acontece porque as vistas materializadas precisam de voltar a processar todos os dados ingeridos, o que é menos eficiente do que identificar os registos individuais a atualizar com base nos predicados de acréscimo ou eliminação.
  • As vistas materializadas são uma solução totalmente gerida. A vista materializada é definida uma vez e a materialização ocorre em segundo plano pelo sistema. O comando de atualização requer um processo orquestrado (por exemplo, Azure Data Factory, Logic Apps, Power Automate e outros) que executa explicitamente o comando de atualização sempre que existirem atualizações. Se as vistas materializadas funcionarem bem o suficiente para o seu caso de utilização, a utilização de vistas materializadas requer menos gestão e manutenção.

Exemplos - Sintaxe simplificada

Os exemplos seguintes utilizam a sintaxe Simplificada.

Exemplo geral

É criada a seguinte tabela.

.set-or-replace People <|
datatable(Name:string, Address:string)[
  "Alice", "221B Baker street",
  "Bob", "1600 Pennsylvania Avenue",
  "Carl", "11 Wall Street New York"
]
Name Endereço
Alice Rua Baker 221B
Bob Avenida Pensilvânia, 1600
Carl 11 Wall Street Nova Iorque

Em seguida, é executado o seguinte comando de atualização:

.update table People on Name <|
  datatable(Name:string, Address:string)[
  "Alice", "2 Macquarie Street",
  "Diana", "350 Fifth Avenue" ]

Em que appendQuery produz o seguinte conjunto de resultados:

Name Endereço
Alice Rua Macquarie 2
Diana 350 Quinta Avenida

Uma vez que atualizámos naName coluna, a linha Alice será eliminada e a tabela após a atualização terá o seguinte aspeto:

Name Endereço
Alice Rua Macquarie 2
Bob Avenida Pensilvânia, 1600
Carl 11 Wall Street Nova Iorque
Diana 350 Quinta Avenida

Repare que Diana não foi encontrada na tabela original. Isto é válido e não foi eliminada nenhuma linha correspondente.

Da mesma forma, se houvesse várias linhas com o nome Alice na tabela original, todas elas teriam sido eliminadas e substituídas pela única linha Alice que temos no final.

Tabela de exemplo

Os exemplos seguintes baseiam-se na seguinte tabela:

.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])

Este comando cria uma tabela com 100 registos a começar com:

ID Código Cor
1 Funcionário Blue
2 Cliente Cinzento
3 Funcionário Red
4 Cliente Blue
5 Funcionário Cinzento
6 Cliente Red
6 Funcionário Blue

Atualizar uma única coluna numa linha

O exemplo seguinte utiliza a sintaxe simplificada para atualizar uma única coluna numa única linha que corresponda ao predicado de acréscimo:

.update table Employees on Id with(whatif=true) <|
    Employees
    | where Id==3
    | extend Color="Orange"

Repare que whatif está definido como verdadeiro. Após esta consulta, a tabela permanece inalterada, mas o comando devolve que haveria uma extensão com uma linha eliminada e uma nova extensão com uma linha.

O comando seguinte executa a atualização:

.update table Employees on Id <|
  Employees
  | where Id==3
  | extend Color="Orange"

Atualizar uma única coluna em várias linhas

O exemplo seguinte é atualizado numa única coluna Color para o valor de Verde nas linhas que correspondem ao predicado de acréscimo.

.update table Employees on Id <|
  Employees
  | where Code=="Employee"
  | where Color=="Blue"
  | extend Color="Green"

Atualizar várias colunas em várias linhas

O exemplo seguinte atualiza múltiplas colunas em todas as linhas que correspondem ao predicado de acréscimo.

.update table Employees on Id <|
  Employees
  | where Color=="Gray"
  | extend Code=strcat("ex-", Code)
  | extend Color=""

Atualizar linhas com outra tabela

Neste exemplo, o primeiro passo é criar a seguinte tabela de mapeamento:

.set-or-replace ColorMapping <|
  datatable(OldColor:string, NewColor:string)[
    "Red", "Pink",
    "Blue", "Purple",
    "Gray", "LightGray",
    "Orange", "Yellow",
    "Green", "AppleGreen"
  ]

Em seguida, esta tabela de mapeamento é utilizada para atualizar algumas cores na tabela original com base no predicado de acréscimo e na "Nova Cor" correspondente:

.update table Employees on Id <|
  Employees
  | where Code=="Customer"
  | lookup ColorMapping on $left.Color==$right.OldColor
  | project Id, Code, Color=NewColor

Atualizar linhas com uma tabela de teste

Um padrão popular é primeiro obter dados numa tabela de teste antes de atualizar a tabela principal.

O primeiro comando cria uma tabela de teste:

.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])

O comando seguinte atualiza a tabela principal com os dados na tabela de teste:

.update table Employees on Id <|
  MyStagingTable

Alguns registos na tabela de teste não existiam na tabela principal (ou seja, tinham Id>100) mas ainda estavam inseridos na tabela principal (comportamento de upsert).

Exemplos - Sintaxe expandida

Os exemplos seguintes utilizam a sintaxe Expandida.

Chave composta

A sintaxe simplificada pressupõe que uma única coluna pode corresponder as linhas no appendQuery para inferir linhas a eliminar. Pode utilizar mais do que uma coluna, por exemplo, com chaves compostas.

O primeiro comando cria uma tabela com chaves compostas:

.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"
  ]

O comando seguinte atualiza um registo específico com a sintaxe expandida:

.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";

Controlo completo

No exemplo seguinte, todas as linhas com CodeFuncionário são eliminadas e as linhas com CodeFuncionárioeColor roxo são acrescentadas. São eliminadas mais linhas do que as inseridas.

.update table Employees delete D append A <|
  let D = Employees
    | where Code=="Employee";
  let A = Employees
    | where Code=="Employee"
    | where Color=="Purple"
    | extend Code="Corporate"
    | extend Color="Mauve";

Este tipo de ação só é possível com a sintaxe expandida, que controla de forma independente as operações de eliminação e acréscimo.