Sdílet prostřednictvím


Příkaz Rozsahy .replace

Tento příkaz se spustí v kontextu konkrétní databáze. Přesune zadané rozsahy z jejich zdrojových tabulek do cílové tabulky a pak zahodí zadané rozsahy z cílové tabulky. Všechny operace vyřazení a přesunutí se provádějí v jedné transakci.

Poznámka:

Horizontální oddíly dat se nazývají rozsahy a všechny příkazy používají jako synonymum "extent" nebo "extents". Další informace o rozsahech najdete v přehledu rozsahů (horizontálních oddílů dat).

Oprávnění

Pro zdrojové a cílové tabulky musíte mít alespoň oprávnění správce tabulky.

Omezení

  • Zdrojové i cílové tabulky musí být v kontextové databázi.
  • Očekává se, že všechny rozsahy určené parametrem ExtentsToDropQuery budou patřit do cílové tabulky.
  • Očekává se, že všechny sloupce ve zdrojových tabulkách budou existovat v cílové tabulce se stejným názvem a datovým typem.
  • Pokud je cílovou tabulkou zdrojová tabulka materializovaného zobrazení, příkaz může selhat, protože materializované zobrazení nezpracuje záznamy v přesunutých rozsahech. Další podrobnosti najdete na stránce omezení materializovaných zobrazení. Tuto chybu můžete obejít nastavením nové doby příjmu dat během příkazu pro přesunutí. Viz setNewIngestionTime podporované vlastnosti.

Syntaxe

.replace[async] extents in table DestinationTableName [ with (PropertyName = PropertyValue [, ...]] <|{)ExtentsToDropQuery},{ExtentsToMoveQuery}

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

Parametry

Název Type Požadováno Popis
async string Pokud je zadaný, příkaz se spustí asynchronně.
DestinationTableName string ✔️ Název tabulky, do které se mají rozsahy přesunout.
FromDate datetime Počáteční datum okna dotazu.
ToDate datetime Koncové datum okna dotazu.
PropertyName, PropertyValue string Jedna nebo více podporovaných vlastností.
ExtentsToDropQuery string ✔️ Výsledky tohoto dotazu určují ID rozsahu, které by se měly vynechat z cílové tabulky. Měla by vrátit sadu záznamů se sloupcem s názvem "ExtentId".
ExtentsToMoveQuery string ✔️ Výsledky tohoto dotazu dotazovací jazyk Kusto (KQL) určují zdrojové tabulky a ID rozsahu, které se mají přesunout do cílové tabulky. Měla by vrátit sadu záznamů se sloupci s názvem ExtentId a TableName.

Podporované vlastnosti

Název vlastnosti Typ Požadováno Popis
setNewIngestionTime bool Pokud je nastavená hodnota true, přiřadí se nový čas příjmu dat ke všem záznamům v rozsahu, který se přesouvá. To je užitečné, když by záznamy měly zpracovávat úlohy, které závisí na kurzorech databáze, jako jsou materializovaná zobrazení a průběžný export dat.
extentCreatedOnFrom datetime ✔️ Platí pro rozsahy vytvořené po tomto bodu v čase.
extentCreatedOnTo datetime ✔️ Platí pro rozsahy vytvořené před tímto bodem v čase.

Poznámka:

Pro zajištění lepšího výkonu nastavte parametry extentCreatedOnFrom a extentCreatedOnTo na nejmenší možný rozsah.

Návraty

Při synchronním spuštění příkazu se vrátí tabulka s následujícím schématem.

Výstupní parametr Typ Popis
OriginalExtentId string Jedinečný identifikátor (GUID) původního rozsahu ve zdrojové tabulce, která byla přesunuta do cílové tabulky, nebo rozsah v cílové tabulce, která byla vyřazena.
ResultExtentId string Jedinečný identifikátor (GUID) pro rozsah výsledků přesunutý ze zdrojové tabulky do cílové tabulky. Prázdné, pokud došlo k vyřazení rozsahu z cílové tabulky. Při selhání se nezdařilo.
Detaily string Obsahuje podrobnosti o selhání, pokud operace selže.

Při asynchronním spuštění příkazu se vrátí ID operace (GUID). Pomocí příkazu operace .show monitorujte stav operace a načtěte výsledky úspěšného spuštění pomocí příkazu Podrobnosti operace .show.

Poznámka:

Příkaz selže, pokud v cílové tabulce neexistují rozsahy vrácené dotazem ExtentsToDropQuery . K tomu může dojít v případě, že se rozsahy sloučily před provedením příkazu replace. Pokud se chcete ujistit, že příkaz selže v chybějících rozsahech, zkontrolujte, jestli dotaz vrátí očekávané id rozsahu. Příklad č. 1 níže selže, pokud v tabulce MyOtherTable neexistuje rozsah poklesu. Příklad č. 2 však bude úspěšný, i když rozsah poklesu neexistuje, protože dotaz, který se má vypustit, nevrátil žádná ID rozsahu.

Příklady

Přesunutí všech rozsahů v zadaném časovém rozsahu vytváření ze dvou tabulek

Přesuňte všechny rozsahy ze dvou konkrétních tabulek (MyTable1, ) v zadaném časovém rozsahu vytváření do tabulky MyOtherTablea odstraňte všechny rozsahy označené drop-by:MyTagMyOtherTable MyTable2:

.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
    {
        .show table MyOtherTable extents where tags has 'drop-by:MyTag'
    },
    {
        .show tables (MyTable1,MyTable2) extents
    }

Ukázkový výstup

OriginalExtentId ResultExtentId Detaily
e133f050-a1e2-4dad-8552-1f5cf47cab69 0d96ab2d-9dd2-4d2c-a45e-b24c65aa6687
cdbeb35b-87ea-499f-b545-defbae091b57 a90a303c-8a14-4207-8f35-d8ea94ca45be
4fcb4598-9a31-4614-903c-0c67c286da8c 97aafea1-59ff-4312-b06b-08f42187872f
2dfdef64-62a3-4950-a130-96b5b1083b5a 0fb7f3da-5e28-4f09-a000-e62eb41592df

Přesunutí všech rozsahů v zadaném časovém rozsahu vytváření z jedné tabulky do jiné, přetažení konkrétního rozsahu

Přesuňte všechny rozsahy v zadaném časovém rozsahu vytváření z jedné konkrétní tabulky (MyTable1) do tabulky MyOtherTablea přesuňte konkrétní rozsah MyOtherTablepodle jeho ID:

.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
    {
        print ExtentId = "2cca5844-8f0d-454e-bdad-299e978be5df"
    },
    {
        .show table MyTable1 extents 
    }
.replace extents in table MyOtherTable with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
    {
        .show table MyOtherTable extents
        | where ExtentId == guid(2cca5844-8f0d-454e-bdad-299e978be5df) 
    },
    {
        .show table MyTable1 extents 
    }

Implementace idempotentní logiky

Implementujte idempotentní logiku tak, aby Kusto zahodil rozsahy z tabulky t_dest pouze v případě, že existuje rozsah pro přesun z tabulky t_source do tabulky t_dest:

.replace async extents in table t_dest with (extentCreatedOnFrom=datetime(2023-03-10), extentCreatedOnTo=datetime(2023-03-12)) <|
{
    let any_extents_to_move = toscalar( 
        t_source
        | where extent_tags() has 'drop-by:blue'
        | summarize count() > 0
    );
    let extents_to_drop =
        t_dest
        | where any_extents_to_move and extent_tags() has 'drop-by:blue'
        | summarize by ExtentId = extent_id()
    ;
    extents_to_drop
},
{
    let extents_to_move = 
        t_source
        | where extent_tags() has 'drop-by:blue'
        | summarize by ExtentId = extent_id(), TableName = 't_source'
    ;
    extents_to_move
}