Adatbáziskurzorok

Az adatbázis-kurzor egy adatbázisszintű objektum, amely lehetővé teszi az adatbázisok többszöri lekérdezését. Akkor is konzisztens eredményeket kap, ha a lekérdezésekkel párhuzamosan vannak data-append vagy data-retention műveletek történnek.

Az adatbázis-kurzorok két fontos forgatókönyv kezelésére szolgálnak:

  • Az a lehetőség, hogy ugyanazt a lekérdezést többször megismételjük, és ugyanazokat az eredményeket kapjuk, ha a lekérdezés "ugyanazt az adatkészletet" jelzi.

  • A "pontosan egyszer" lekérdezések készítésének lehetősége. Ez a lekérdezés csak azokat az adatokat "látja", amelyeket egy korábbi lekérdezés nem látott, mert az adatok akkor nem érhetők el. A lekérdezés lehetővé teszi például egy tábla összes újonnan érkezett adatának iterálását anélkül, hogy attól tartana, hogy ugyanazt a rekordot kétszer dolgozza fel, vagy véletlenül kihagyja a rekordokat.

Az adatbázis-kurzor a lekérdezési nyelvben a típusú stringskaláris értékként jelenik meg. A tényleges értéket átlátszatlannak kell tekinteni, és az érték mentésén vagy az alább feljegyzett kurzorfüggvények használatán kívül semmilyen más művelet nem támogatott.

Kurzorfüggvények

A Kusto három függvényt biztosít a fenti két forgatókönyv megvalósításához:

  • cursor_current(): Ezzel a függvénnyel lekérheti az adatbázis-kurzor aktuális értékét. Ezt az értéket a két másik függvény argumentumaként is használhatja.

  • cursor_after(rhs:string): Ez a speciális függvény olyan táblarekordokon használható, amelyeken engedélyezve van az IngestionTime szabályzat . Egy típusú bool skaláris értéket ad vissza, amely azt jelzi, hogy a rekord ingestion_time() adatbázis-kurzor értéke az rhs adatbázis-kurzor értéke után következik-e.

  • cursor_before_or_at(rhs:string): Ez a speciális függvény használható azon táblarekordokon, amelyeken engedélyezve van az IngestionTime szabályzat . Egy típusú bool skaláris értéket ad vissza, amely jelzi, hogy a rekord adatbáziskurzor-értéke ingestion_time() az rhs adatbázis kurzorértéke előtt vagy után érkezik-e.

A két speciális függvény (cursor_after és cursor_before_or_at) is rendelkezik mellékhatással: Használatukkor a Kusto az adatbázis-kurzor aktuális értékét bocsátja ki a @ExtendedProperties lekérdezés eredményhalmazába. A kurzor tulajdonságneve , Cursorértéke pedig egyetlen string.

Például:

{"Cursor" : "636040929866477946"}

Korlátozások

Az adatbázis-kurzorok csak olyan táblákkal használhatók, amelyeken engedélyezve van az IngestionTime szabályzat . Egy ilyen tábla minden rekordja annak az adatbázis-kurzornak az értékéhez van társítva, amely a rekord betöltésekor volt érvényben. Így a ingestion_time() függvény használható.

Az adatbázis-kurzorobjektum nem tartalmaz értelmezhető értéket, kivéve, ha az adatbázis legalább egy olyan táblával rendelkezik, amely rendelkezik definiált IngestionTime szabályzattal . Ez az érték garantáltan frissül a betöltési előzmények által szükséges módon az ilyen táblákba, és a lekérdezések futnak, amelyek hivatkoznak az ilyen táblákra. Előfordulhat, hogy más esetekben frissítjük vagy sem.

A betöltési folyamat először véglegesíti az adatokat, hogy az elérhető legyen a lekérdezéshez, és csak ezután rendel hozzá egy tényleges kurzorértéket minden rekordhoz. Ha a betöltés befejezése után közvetlenül egy adatbázis-kurzor használatával próbál adatokat lekérdezni, előfordulhat, hogy az eredmények még nem tartalmazzák az utolsó hozzáadott rekordokat, mert még nem lettek hozzárendelve a kurzorértékhez. Emellett az adatbázis aktuális kurzorértékének ismételt lekérése ugyanazt az értéket adja vissza, még akkor is, ha a betöltés között történt, mert csak a kurzor véglegesítése tudja frissíteni az értékét.

A táblák adatbázis-kurzorokon alapuló lekérdezése csak akkor garantáltan "működik" (pontosan egyszeri garanciát nyújt), ha a rekordok közvetlenül ebbe a táblába vannak betöltve. Ha olyan extents parancsokat használ, mint a move extents.replace/extents, hogy adatokat helyezzen át a táblába, vagy ha .rename táblát használ, akkor a tábla adatbázis-kurzorokkal való lekérdezése nem garantáltan nem marad le semmilyen adatról. Ennek az az oka, hogy a rekordok betöltési ideje a kezdeti betöltéskor van hozzárendelve, és nem változik az áthelyezési mértékek művelete során. Ezért amikor a mértékek átkerülnek a céltáblába, lehetséges, hogy az ezekben a mértékekben lévő rekordokhoz rendelt kurzorérték már fel lett dolgozva (és az adatbázis-kurzor következő lekérdezése kihagyja az új rekordokat).

Példa: Rekordok feldolgozása pontosan egyszer

Employees Sématáblázat [Name, Salary]esetén a következő eljárással dolgozhatja fel folyamatosan az új rekordokat a táblába való betöltéskor:

// [Once] Enable the IngestionTime policy on table Employees
.set table Employees policy ingestiontime true

// [Once] Get all the data that the Employees table currently holds 
Employees | where cursor_after('')

// The query above will return the database cursor value in
// the @ExtendedProperties result set. Lets assume that it returns
// the value '636040929866477946'

// [Many] Get all the data that was added to the Employees table
// since the previous query was run using the previously-returned
// database cursor 
Employees | where cursor_after('636040929866477946') // -> 636040929866477950

Employees | where cursor_after('636040929866477950') // -> 636040929866479999

Employees | where cursor_after('636040929866479999') // -> 636040939866479000