Adatbázis-kurzorok

Szolgáltatások váltása a Verzió legördülő listával. További információ a navigációról.
A következőkre vonatkozik: ✅ Azure Data Explorer

A 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 kaphat, ha data-append vagy data-retention műveletek történnek a lekérdezésekkel párhuzamosan.

Az adatbázis-kurzorok két fontos forgatókönyv kezelésére lettek kialakítva:

  • Az a lehetőség, hogy ugyanazt a lekérdezést többször megismételje, és ugyanazokat az eredményeket kapja, amennyiben a lekérdezés "ugyanazt az adatkészletet" jelzi.

  • A "pontosan egyszer" lekérdezés létrehozásának 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 a 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és nyelvében stringtípusú skalá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ábbi kurzorfüggvények használatán kívül semmilyen 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 használhatja.

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

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

A két speciális függvény (cursor_after és cursor_before_or_at) szintén mellékhatással rendelkezik: Használatukkor a Kusto a lekérdezés eredményhalmazába bocsátja ki az adatbázis-kurzor @ExtendedProperties. 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, amelyekhez engedélyezve van a IngestionTime szabályzat. Az ilyen táblák minden rekordja az adatbázis-kurzor azon é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 csak akkor rendelkezik értelmezhető értékkel, ha az adatbázis legalább egy olyan táblával rendelkezik, amely IngestionTime szabályzatot definiálni. Ez az érték garantáltan frissíti a betöltési előzmények által szükséges módon az ilyen táblákat, és a lekérdezések futnak, amelyek az ilyen táblákra hivatkoznak. 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. Előfordulhat, hogy az adatok lekérdezése közvetlenül az adatbázis-kurzor használatával történő betöltése után nem tartalmazza az utolsó hozzáadott rekordokat, mert a kurzor értéke még nincs hozzárendelve. Emellett az adatbázis aktuális kurzorértékének ismételt beolvasása ugyanazt az értéket adja vissza, még akkor is, ha a betöltés a kettő 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-kurzorok alapján történő 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 mértékparancsokat használ, mint például a .move extents vagy .replace extents az adatok táblázatba való áthelyezéséhez, vagy ha .rename tableparancsot használ, akkor a tábla lekérdezése adatbázis-kurzorokkal nem garantált, hogy ne hiányoznak adatok. 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.

Ha a mértékek a céltáblába kerülnek, előfordulhat, hogy a hozzárendelt kurzorérték már feldolgozásra került, és az adatbázis-kurzor következő lekérdezése kihagyja az új rekordokat.

Példák:

A következő példák bemutatják, hogyan lehet pontosan egyszer feldolgozni a rekordokat.

A séma Employees[Name, Salary] tábla esetében az új rekordoknak a táblázatba való betöltésekor történő folyamatos feldolgozásához használja az alábbi eljárást:

// [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