共用方式為


資料庫數據指標

適用於:✅Azure 數據總管

資料庫數據指標 是資料庫層級物件,可讓您多次查詢資料庫。 即使查詢同時發生 data-appenddata-retention 作業,您仍會收到一致的結果。

資料庫數據指標的設計訴求是解決兩個重要案例:

  • 只要查詢指出「相同的數據集」,就能夠重複相同的查詢多次並取得相同的結果。

  • 能夠進行「完全一次」查詢。 此查詢只會「查看」先前查詢未看到的數據,因為數據當時無法使用。 例如,查詢可讓您逐一查看數據表中所有新抵達的數據,而不必擔心處理相同的記錄兩次或錯誤略過記錄。

資料庫數據指標會以查詢語言表示為 string類型的純量值。 實際值應該視為不透明,除了儲存其值或使用下列數據指標函式之外,不支援任何其他作業。

數據指標函式

Kusto 提供三個函式來協助實作上述兩個案例:

  • cursor_current():使用此函式擷取資料庫數據指標的目前值。 您可以使用此值作為其他兩個函式的自變數。

  • cursor_after(rhs:string):此特殊函式可用於已啟用 IngestionTime 原則 的數據表記錄。 它會傳回類型為純量值 bool,指出記錄 ingestion_time() 資料庫數據指標值是否在 rhs 資料庫數據指標值之後。

  • cursor_before_or_at(rhs:string):此特殊函式可用於已啟用 IngestionTime 原則 的數據表記錄上。 它會傳回類型為 bool 的純量值,指出記錄 ingestion_time() 資料庫數據指標值之前或 rhs 資料庫數據指標值。

這兩個特殊函式(cursor_aftercursor_before_or_at)也有副作用:使用時,Kusto 會將資料庫數據指標的目前值發出 至查詢 @ExtendedProperties 結果集。 資料指標的屬性名稱是 Cursor,而其值為單一 string

例如:

{"Cursor" : "636040929866477946"}

限制

資料庫數據指標只能與啟用 IngestionTime 原則 的數據表搭配使用。 這類數據表中的每個記錄都會與擷取記錄時生效的資料庫數據指標值相關聯。 因此,可以使用 ingestion_time() 函式。

除非資料庫至少有一個數據表已定義 IngestionTime 原則,否則資料庫數據指針對象不會保留有意義的值。 此值保證會視需要將擷取歷程記錄更新至這類數據表,並執行查詢,以參考這類數據表。 在其他情況下,可能會更新它或可能不會更新。

擷取程式會先認可數據,使其可供查詢,然後才將實際數據指標值指派給每個記錄。 使用資料庫數據指標擷取之後立即查詢數據可能不會併入新增的最後一筆記錄,因為數據指標值尚未指派。 此外,重複擷取目前的資料庫數據指標值可能會傳回相同的值,即使擷取是在兩者之間完成,因為只有數據指標認可可以更新其值。

如果記錄直接擷取到該數據表,則查詢以資料庫數據指標為基礎的數據表只會保證「正常運作」(只提供一次保證)。 如果您使用範圍命令,例如 .move 範圍.replace extents 將數據移至數據表,或如果您使用 .rename 數據表,則不保證使用資料庫數據指標查詢此數據表以避免遺漏任何數據。 這是因為一開始內嵌時會指派記錄的擷取時間,而且不會在移動範圍作業期間變更。

當範圍移至目標數據表時,指派的數據指標值可能已經處理,而資料庫數據指標的下一個查詢將會遺漏新的記錄。

範例:只處理一次記錄

對於具有架構 [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