次の方法で共有


データベース カーソル

適用対象: Azure Data Explorer

データベース カーソル は、データベース に対して複数回クエリを実行できるデータベース レベルのオブジェクトです。 クエリと並行して data-append または data-retention 操作が行われている場合でも、一貫性のある結果が得られます。

データベース カーソルは、次の 2 つの重要なシナリオに対処するように設計されています。

  • クエリが "同じデータ セット" を示している限り、同じクエリを複数回繰り返して同じ結果を取得する機能。

  • "1 回だけ" クエリを作成する機能。 このクエリでは、以前のクエリで表示されなかったデータのみが "表示" されます。これは、データが使用できなかったためです。 クエリを使用すると、たとえば、同じレコードを 2 回処理したり、誤ってレコードをスキップしたりする心配なしに、テーブルに新しく到着したすべてのデータを反復処理できます。

データベース カーソルは、string型のスカラー値としてクエリ言語で表されます。 実際の値は不透明と見なす必要があり、その値を保存したり、次のカーソル関数を使用したりする以外の操作はサポートされません。

カーソル関数

Kusto には、上記の 2 つのシナリオの実装に役立つ 3 つの関数が用意されています。

2 つの特殊な関数 () にも副作用があります。使用すると、Kusto はクエリの 結果セットに データベース カーソルの 現在の値を出力します。 カーソルのプロパティ名は Cursorされ、その値は 1 つの stringです。

例えば:

{"Cursor" : "636040929866477946"}

制限

データベース カーソルは、IngestionTime ポリシー が有効になっているテーブルでのみ使用できます。 このようなテーブル内の各レコードは、レコードが取り込まれたときに有効だったデータベース カーソルの値に関連付けられます。 そのため、ingestion_time() 関数を使用できます。

IngestionTime ポリシーが定義されているテーブルがデータベースに少なくとも 1 つ存在しない限り、データベース カーソル オブジェクトは意味のある値 保持しません。 この値は、インジェスト履歴によって必要に応じて、このようなテーブルに更新され、クエリが実行され、そのようなテーブルを参照することが保証されます。 それ以外の場合は更新される場合もあれば、更新されない場合もあります。

インジェスト プロセスは、最初にデータをコミットしてクエリに使用できるようにし、次に各レコードに実際のカーソル値を割り当てます。 データベース カーソルを使用してインジェスト直後にデータのクエリを実行すると、カーソル値がまだ割り当てられていないため、最後に追加されたレコードが組み込まれない可能性があります。 また、現在のデータベース カーソル値を繰り返し取得すると、その間にインジェストが行われた場合でも同じ値が返される場合があります。これは、カーソル コミットのみが値を更新できるためです。

データベース カーソルに基づいてテーブルにクエリを実行することは、レコードがそのテーブルに直接取り込まれる場合にのみ "動作" することが保証されます (1 回限りの保証が提供されます)。 エクステントの .move エクステントや .replace エクステント などのエクステント コマンドを使用してテーブルにデータを移動する場合、または .rename テーブル使用している場合は、データベース カーソルを使用してこのテーブルに対してクエリを実行しても、データが失われません。 これは、レコードの取り込み時間が最初に取り込まれるときに割り当てられ、移動エクステント操作中に変更されないためです。

エクステントがターゲット 表に移動されると、割り当てられたカーソル値が既に処理されている可能性があり、データベース・カーソルによる次の照会は新しいレコードを見逃します。

例: レコードを 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