Sdílet prostřednictvím


Příkaz .update table (Preview)

Příkaz .update table provádí aktualizace dat v zadané tabulce odstraněním a připojením záznamů atomicky.

Upozorňující

Tento příkaz není možné obnovit.

Poznámka:

Když spustíte .update table příkaz v tabulce, která je zdrojem zásad aktualizace, příkaz aktivuje tyto zásady aktualizace, .update table pro které je upravená tabulka zdrojem zásad aktualizace.

V jednom příkazu můžete odstranit až 5 milionů záznamů.

Oprávnění

Ke spuštění tohoto příkazu musíte mít alespoň oprávnění správce tabulky.

Syntaxe

Existují dvě možnosti syntaxe, zjednodušená syntaxe a rozšířená syntaxe.

Přečtěte si další informace o konvencích syntaxe.

Rozšířená syntaxe

Rozšířená syntaxe nabízí flexibilitu při definování dotazu pro odstranění řádků a jiného dotazu pro připojení řádků:

.updatetableTableNamedeleteDeleteIdentifier AppendIdentifierappend [with(propertyName=propertyValue])<|
letDeleteIdentifier=DeletePredicate;
letAppendIdentifier=AppendPredicate;

Parametry pro rozšířenou syntaxi

Name Type Požadováno Popis
TableName string ✔️ Název tabulky, která se má aktualizovat.
DeleteIdentifier string ✔️ Název identifikátoru použitý k určení predikátu odstranění použitého na aktualizovanou tabulku.
OdstranitPredicate string ✔️ Text dotazu, jehož výsledky se používají jako data k odstranění. Predikát odstranění musí obsahovat alespoň jeden where operátor a může používat pouze následující operátory: extend, where, projectjoin a lookup.
AppendIdentifier string ✔️ Název identifikátoru použitý k zadání predikátu připojení použitého na aktualizovanou tabulku.
AppendPredicate string ✔️ Text dotazu, jehož výsledky se používají jako data k připojení.

Důležité

  • Predikáty odstranění i připojení nemůžou používat vzdálené entity, entity mezi databázemi a entity mezi clustery. Predikáty nemůžou odkazovat na externí tabulku nebo používat externaldata operátor.
  • Očekává se, že přidávací a odstraňovací dotazy generují deterministické výsledky. Nedeterministické dotazy můžou vést k neočekávaným výsledkům. Dotaz je deterministický, pouze pokud by vracel stejná data, pokud by byl spuštěn vícekrát.
    • Například použití operátorutake,sampleoperátoru, rand funkce a dalších takových operátorů se nedoporučuje, protože tyto operátory nejsou deterministické.
  • V rámci update provádění se dotazy můžou spouštět více než jednou. Pokud jsou výsledky zprostředkujícího dotazu nekonzistentní, může příkaz update vést k neočekávaným výsledkům.

Zjednodušená syntaxe

Zjednodušená syntaxe vyžaduje přidávací dotaz a klíč. Klíč je sloupec v tabulce, který představuje jedinečné hodnoty v tabulce. Tento sloupec slouží k definování řádků, které mají být z tabulky odstraněny. Spojení se provádí mezi původní tabulkou a přidávacím dotazem, aby bylo možné identifikovat řádky, které souhlasí s jejich hodnotou ve vztahu k tomuto sloupci.

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

Parametry pro zjednodušenou syntaxi

Name Type Požadováno Popis
TableName string ✔️ Název tabulky, která se má aktualizovat.
IDColumnName string ✔️ Název sloupce identifikující řádky. Sloupec musí být v tabulce i v appendQuery.
appendQuery string ✔️ Text dotazu nebo příkazu pro správu, jehož výsledky se používají jako data k připojení. Schéma dotazu musí být stejné jako schéma tabulky.

Důležité

  • Přidávací dotaz nemůže používat vzdálené entity, entity mezi databázemi a entity mezi clustery, odkazovat na externí tabulku nebo použít externaldata operátor.
  • Očekává se, že přidávací dotaz vytvoří deterministické výsledky. Nedeterministické dotazy můžou vést k neočekávaným výsledkům. Dotaz je deterministický, pokud a pouze pokud vrátí stejná data, pokud se spustí vícekrát.
    • Například použití operátorutake,sampleoperátoru, rand funkce a dalších takových operátorů se nedoporučuje, protože tyto operátory nejsou deterministické.
  • V rámci update provádění se dotazy můžou spouštět více než jednou. Pokud jsou výsledky zprostředkujícího dotazu nekonzistentní, může příkaz update vést k neočekávaným výsledkům.

Podporované vlastnosti

Name Typ Popis
Whatif bool Pokud truevrátí počet záznamů, které budou připojeny / odstraněny v každém horizontálním oddílu, bez připojení / odstranění záznamů. Výchozí hodnota je false.
Distribuované bool Pokud truepříkaz ingestuje ze všech uzlů, které spouští dotaz paralelně. Výchozí hodnota je false. Podívejte se na tipy k výkonu.

Důležité

Před spuštěním aktualizace doporučujeme nejprve spustit predikáty v whatif režimu, aby se před odstraněním nebo připojením dat ověřily predikáty.

Návraty

Výsledkem příkazu je tabulka, ve které každý záznam představuje rozsah , který byl vytvořen s novými daty nebo měl odstraněné záznamy.

Name Typ Popis
Table string Tabulka, ve které byl rozsah vytvořen nebo odstraněn.
Akce string Vytvořte nebo odstraňte v závislosti na akci provedené v rozsahu.
ExtentId guid Jedinečný identifikátor rozsahu, který byl vytvořen nebo odstraněn příkazem.
Rowcount long Počet řádků vytvořených nebo odstraněných v zadaném rozsahu příkazem.

Volba mezi .update table a materializovanými zobrazeními

Existují scénáře, ve kterých můžete pomocí .update table příkazu nebo materializovaného zobrazení dosáhnout stejného cíle v tabulce. Materializované zobrazení lze například použít k zachování nejnovější verze každého záznamu nebo aktualizace k aktualizaci záznamů, pokud je k dispozici nová verze.

Při rozhodování, kterou metodu použít, použijte následující pokyny:

  • Pokud model aktualizace materializovaná zobrazení nepodporuje, použijte příkaz update.
  • Pokud má zdrojová tabulka velký objem příjmu dat, ale jenom několik aktualizací, může být použití příkazu update výkonnější a spotřebovávat méně mezipaměti nebo úložiště než materializovaná zobrazení. Je to proto, že materializovaná zobrazení potřebují znovu zpracovat všechna ingestovaná data, což je méně efektivní než identifikace jednotlivých záznamů, které se mají aktualizovat na základě predikátů připojení nebo odstranění.
  • Materializovaná zobrazení je plně spravované řešení. Materializované zobrazení je definováno jednou a materializace probíhá na pozadí systémem. Příkaz update vyžaduje orchestrovaný proces (například Azure Data Factory, Logic Apps, Power Automate a další), který explicitně spustí příkaz aktualizace pokaždé, když dojde k aktualizacím. Pokud materializovaná zobrazení dobře fungují pro váš případ použití, vyžaduje použití materializovaných zobrazení méně správy a údržby.

Tipy týkající se výkonu

  • Příjem dat je operace náročná na prostředky, která může ovlivnit souběžné aktivity v clusteru, včetně spuštěných dotazů. Doporučujeme, abyste se vyhnuli následujícím akcím náročným na prostředky: spouštění mnoha .update příkazů najednou a náročnému používání distribuované vlastnosti.
  • Omezte přidávací data na méně než 1 GB na operaci. V případě potřeby použijte více aktualizačních příkazů.
  • distributed Příznak nastavte pouze true v případě, že je množství dat vytvářených dotazem velké, překročí 1 GB a nevyžaduje serializaci: více uzlů pak může vytvořit výstup paralelně. Tento příznak nepoužívejte, pokud jsou výsledky dotazu malé, protože může zbytečně generovat mnoho malých datových horizontálních oddílů.

Příklady – zjednodušená syntaxe

Následující příklady používají zjednodušenou syntaxi.

Obecný příklad

Vytvoří se následující tabulka.

.set-or-replace People <|
datatable(Name:string, Address:string)[
  "Alice", "221B Baker street",
  "Bob", "1600 Pennsylvania Avenue",
  "Carl", "11 Wall Street New York"
]
Název Address
Alice 221B Baker street
Robert 1600 Pennsylvania Avenue
Carl 11 Wall Street New York

Pak se spustí následující příkaz aktualizace:

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

Kde appendQuery poskytuje následující sadu výsledků:

Název Address
Alice 2 Macquarie Street
Diana 350 Pátá avenue

Vzhledem k tomu, že jsme Name aktualizovali sloupec, řádek Alice se odstraní a tabulka po aktualizaci bude vypadat takto:

Název Address
Alice 2 Macquarie Street
Robert 1600 Pennsylvania Avenue
Carl 11 Wall Street New York
Diana 350 Pátá avenue

Všimněte si, že Diana nebyla v původní tabulce nalezena. Toto je platné a nebyl odstraněn žádný odpovídající řádek.

Podobně pokud by v původní tabulce bylo více řádků s názvem Alice, všechny by byly odstraněny a nahrazeny jedním řádkem Alice, který máme na konci.

Příklad tabulky

Další příklady jsou založené na následující tabulce:

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

Tento příkaz vytvoří tabulku s 100 záznamy začínající na:

ID Kód Color
0 Zaměstnanec Modrý
2 Zákazník Šedá
3 Zaměstnanec Červený
4 Zákazník Modrý
5 Zaměstnanec Šedá
6 Zákazník Červený
6 Zaměstnanec Modrý

Aktualizace jednoho sloupce na jednom řádku

Následující příklad používá zjednodušenou syntaxi k aktualizaci jednoho sloupce na jednom řádku, který odpovídá predikátu připojení:

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

Všimněte si, že whatif je nastavená hodnota true. Po tomto dotazu se tabulka nezmění, ale příkaz vrátí rozsah s odstraněným řádkem a novým rozsahem s jedním řádkem.

Následující příkaz ve skutečnosti provede aktualizaci:

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

Aktualizace jednoho sloupce na více řádcích

Následující příklad aktualizuje jeden sloupec Color na hodnotu Green na těch řádcích, které odpovídaly predikátu připojení.

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

Aktualizace více sloupců na více řádcích

Následující příklad aktualizuje více sloupců na všech řádcích, které odpovídají predikátu připojení.

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

Aktualizace řádků pomocí jiné tabulky

V tomto příkladu je prvním krokem vytvoření následující tabulky mapování:

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

Tato tabulka mapování se pak použije k aktualizaci některých barev v původní tabulce na základě predikátu připojení a odpovídající nové barvy:

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

Aktualizace řádků pomocí pracovní tabulky

Oblíbeným vzorem je nejprve přistát data v pracovní tabulce před aktualizací hlavní tabulky.

První příkaz vytvoří pracovní tabulku:

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

Následující příkaz aktualizuje hlavní tabulku daty v pracovní tabulce:

.update table Employees on Id <|
  MyStagingTable

Některé záznamy v pracovní tabulce nebyly v hlavní tabulce (to znamená) Id>100vloženy do hlavní tabulky (to znamená) a přesto byly vloženy do hlavní tabulky (chování upsertu).

Příklady – rozšířená syntaxe

Následující příklady používají rozbalenou syntaxi.

Složený klíč

Zjednodušená syntaxe předpokládá, že jeden sloupec může odpovídat řádkům v appendQuery, aby odvozovaly řádky k odstranění. Můžete použít více než jeden sloupec, například pomocí složených klíčů.

První příkaz vytvoří tabulku se složenými klíči:

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

Další příkaz aktualizuje konkrétní záznam pomocí rozšířené syntaxe:

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

Úplný ovládací prvek

V následujícím příkladu se odstraní všechny řádky se Codezaměstnancem a řádky sCode zaměstnancemaColor fialovou barvou se připojí. Odstraní se více řádků, než se vloží.

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

Tento typ akce je možný pouze pomocí rozšířené syntaxe, která nezávisle řídí operace odstranění a připojení.