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ú string
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á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 rekordingestion_time()
adatbázis-kurzor értéke azrhs
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ékeingestion_time()
azrhs
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: