データベース カーソル
適用対象: Azure Data Explorer
データベース カーソル は、データベース に対して複数回クエリを実行できるデータベース レベルのオブジェクトです。 クエリと並行して data-append
または data-retention
操作が行われている場合でも、一貫性のある結果が得られます。
データベース カーソルは、次の 2 つの重要なシナリオに対処するように設計されています。
クエリが "同じデータ セット" を示している限り、同じクエリを複数回繰り返して同じ結果を取得する機能。
"1 回だけ" クエリを作成する機能。 このクエリでは、以前のクエリで表示されなかったデータのみが "表示" されます。これは、データが使用できなかったためです。 クエリを使用すると、たとえば、同じレコードを 2 回処理したり、誤ってレコードをスキップしたりする心配なしに、テーブルに新しく到着したすべてのデータを反復処理できます。
データベース カーソルは、string
型のスカラー値としてクエリ言語で表されます。 実際の値は不透明と見なす必要があり、その値を保存したり、次のカーソル関数を使用したりする以外の操作はサポートされません。
カーソル関数
Kusto には、上記の 2 つのシナリオの実装に役立つ 3 つの関数が用意されています。
cursor_current(): この関数を使用して、データベース カーソルの現在の値を取得します。 この値は、他の 2 つの関数の引数として使用できます。
cursor_after(rhs:string): この特殊な関数は、IngestionTime ポリシーが有効になっているテーブル レコード 使用できます。 レコードの
ingestion_time()
データベース カーソル値がrhs
データベース カーソル値の後に来るかどうかを示すbool
型のスカラー値を返します。cursor_before_or_at(rhs:string): この特殊な関数は、IngestionTime ポリシーが有効になっているテーブル レコード 使用できます。 レコードの
ingestion_time()
データベース カーソル値がデータベース カーソル値の前か、rhs
のデータベース カーソル値かを示すbool
型のスカラー値を返します。
2 つの特殊な関数 (Cursor
され、その値は 1 つの string
です。
例えば:
{"Cursor" : "636040929866477946"}
制限
データベース カーソルは、IngestionTime ポリシー が有効になっているテーブルでのみ使用できます。 このようなテーブル内の各レコードは、レコードが取り込まれたときに有効だったデータベース カーソルの値に関連付けられます。 そのため、ingestion_time() 関数を使用できます。
IngestionTime ポリシーが定義されているテーブルがデータベースに少なくとも 1 つ存在しない限り、データベース カーソル オブジェクトは意味のある値 保持しません。 この値は、インジェスト履歴によって必要に応じて、このようなテーブルに更新され、クエリが実行され、そのようなテーブルを参照することが保証されます。 それ以外の場合は更新される場合もあれば、更新されない場合もあります。
インジェスト プロセスは、最初にデータをコミットしてクエリに使用できるようにし、次に各レコードに実際のカーソル値を割り当てます。 データベース カーソルを使用してインジェスト直後にデータのクエリを実行すると、カーソル値がまだ割り当てられていないため、最後に追加されたレコードが組み込まれない可能性があります。 また、現在のデータベース カーソル値を繰り返し取得すると、その間にインジェストが行われた場合でも同じ値が返される場合があります。これは、カーソル コミットのみが値を更新できるためです。
データベース カーソルに基づいてテーブルにクエリを実行することは、レコードがそのテーブルに直接取り込まれる場合にのみ "動作" することが保証されます (1 回限りの保証が提供されます)。 エクステントの
エクステントがターゲット 表に移動されると、割り当てられたカーソル値が既に処理されている可能性があり、データベース・カーソルによる次の照会は新しいレコードを見逃します。
例: レコードを 1 回だけ処理する
スキーマ [Name, Salary]
を持つテーブル Employees
の場合、テーブルに取り込まれる新しいレコードを継続的に処理するには、次のプロセスを使用します。
// [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