.replace extents , polecenie

Dotyczy: ✅Azure Data Explorer

To polecenie usuwa i przenosi zakresy w jednej transakcji w kontekście określonej bazy danych. Polecenie usuwa wszystkie określone zakresy z tabeli docelowej i przenosi określone zakresy z tabel źródłowych do tabeli docelowej.

Uwaga

Fragmenty danych są nazywane zakresami, a wszystkie polecenia używają "extent" lub "extents" jako synonimu. Aby uzyskać więcej informacji na temat zakresów, zobacz Omówienie zakresów (fragmentów danych).

Uprawnienia

Musisz mieć co najmniej uprawnienia administratora tabeli dla tabel źródłowych i docelowych.

Ograniczenia

  • Tabele źródłowe i docelowe muszą znajdować się w bazie danych kontekstu.
  • Wszystkie zakresy określone przez extentsToDropQuery powinny należeć do tabeli docelowej.
  • Wszystkie kolumny w tabelach źródłowych powinny istnieć w tabeli docelowej o tej samej nazwie i typie danych.
  • Jeśli tabela docelowa jest tabelą źródłową zmaterializowanego widoku, polecenie może zakończyć się niepowodzeniem, ponieważ zmaterializowany widok nie może przetworzyć rekordów w przeniesionych zakresach. Zobacz więcej szczegółów na stronie zmaterializowanych ograniczeń widoków . Ten błąd można obejść, ustawiając nowy czas pozyskiwania podczas przenoszenia polecenia. Zobacz setNewIngestionTime w obsługiwanych właściwościach.

Składnia

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

Dowiedz się więcej na temat konwencji składni.

Parametry

Nazwisko Type Wymagania opis
async string Jeśli zostanie określony, polecenie jest uruchamiane asynchronicznie.
DestinationTableName string ✔️ Nazwa tabeli, do której mają być przenoszone zakresy.
OdDate datetime Data rozpoczęcia okna zapytania.
ToDate datetime Data zakończenia okna zapytania.
PropertyName, PropertyValue string Co najmniej jedna obsługiwana właściwości.
ExtentsToDropQuery string ✔️ Wyniki tego zapytania muszą zawierać kolumnę ExtentId zawierającą identyfikatory zakresu, które mają zostać usunięte z tabeli docelowej.
ExtentsToMoveQuery string ✔️ Wyniki tego zapytania muszą zawierać ExtentId kolumny i TableName , które zawierają tabele źródłowe i identyfikatory zakresu, które mają zostać przeniesione do tabeli docelowej.

Obsługiwane właściwości

Nazwa właściwości Typ Wymagania opis
setNewIngestionTime bool Jeśli ustawiono truewartość , zostanie przypisany nowy czas pozyskiwania do wszystkich rekordów w zakresach, które są przenoszone. Jest to przydatne, gdy rekordy są przetwarzane przez obciążenia zależne od kursorów bazy danych, takich jak zmaterializowane widoki i ciągły eksport danych.
extentCreatedOnFrom datetime ✔️ Zastosuj do zakresów utworzonych po tym punkcie w czasie.
extentCreatedOnTo datetime ✔️ Zastosuj do zakresów utworzonych przed tym punktem w czasie.

Uwaga

Aby uzyskać lepszą wydajność, ustaw parametr extentCreatedOnFrom i extentCreatedOnTo do najmniejszego możliwego zakresu.

Zwraca

Gdy polecenie jest uruchamiane synchronicznie, zwracana jest tabela z następującym schematem.

Parametr wyjściowy Type Opis
OriginalExtentId string Unikatowy identyfikator (GUID) dla oryginalnego zakresu w tabeli źródłowej, który został przeniesiony do tabeli docelowej lub zakres w tabeli docelowej, która została porzucona.
ResultExtentId string Unikatowy identyfikator (GUID) dla zakresu wyników został przeniesiony z tabeli źródłowej do tabeli docelowej. Puste, jeśli zakres został porzucony z tabeli docelowej. Po awarii: "Niepowodzenie".
Szczegóły string Zawiera szczegóły błędu, jeśli operacja zakończy się niepowodzeniem.

Gdy polecenie jest uruchamiane asynchronicznie, zwracany jest identyfikator operacji (GUID). Monitoruj stan operacji za pomocą polecenia .show operations i pobierz wyniki pomyślnego wykonania za pomocą polecenia .show operation details .

Uwaga

Polecenie zakończy się niepowodzeniem, jeśli zakresy zwrócone przez zapytanie ExtentsToDropQuery nie istnieją w tabeli docelowej. Może się tak zdarzyć, jeśli zakresy zostały scalone przed wykonaniem polecenia replace. Aby upewnić się, że polecenie kończy się niepowodzeniem w przypadku brakujących zakresów, sprawdź, czy zapytanie zwraca oczekiwane identyfikatory ExtentId. Pierwszy przykład zakończy się niepowodzeniem, jeśli zakres spadku nie istnieje w tabeli MyOtherTable. Drugi przykład powiedzie się jednak, mimo że zakres spadku nie istnieje, ponieważ zapytanie do porzucenia nie zwróciło żadnych identyfikatorów zakresu.

Przykłady

Przenieś wszystkie zakresy w określonym zakresie czasu tworzenia z dwóch tabel

Przenieś wszystkie zakresy z dwóch określonych tabel (MyTable1, MyTable2) w określonym zakresie czasu tworzenia do tabeli MyOtherTablei upuść wszystkie zakresy oznaczone MyOtherTable tagiem drop-by:MyTag:

.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
    }

Przykładowe dane wyjściowe

OriginalExtentId ResultExtentId Szczegóły
e133f050-a1e2-4dad-8552-1f5cf47cab69 0d96ab2d-9dd2-4d2c-a45e-b24c65aa687
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

Przenieś wszystkie zakresy w określonym zakresie czasu tworzenia z jednej tabeli do innej, upuść określony zakres

Przenieś wszystkie zakresy w określonym zakresie czasu tworzenia z jednej określonej tabeli (MyTable1) do tabeli MyOtherTablei upuść określony zakres w MyOtherTableelemecie , według jego identyfikatora:

.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 
    }

Implementowanie logiki idempotentnych

Zaimplementuj logikę idempotentną, aby usługa Kusto usuwała zakresy z tabeli t_dest tylko wtedy, gdy istnieją zakresy umożliwiające przejście z tabeli t_source do tabeli 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
}