跨叢集和跨資料庫查詢
查詢會以指定為 內容中的資料庫的特定資料庫執行。 此資料庫可作為許可權檢查的預設值。 如果在查詢中參考實體而不指定叢集或資料庫,則會針對此資料庫解析該實體。
本文說明如何執行涉及位於目前內容資料庫外部實體的查詢。
必要條件
- 如果叢集位於不同的租使用者中,請遵循 允許跨租用戶查詢和命令中的指示。
識別內容中的叢集和資料庫
下表說明如何依查詢環境識別內容中的資料庫。
環境 | 內容中的資料庫 |
---|---|
Kusto Explorer | 默認資料庫是連接 面板中選取的資料庫,而目前的叢集是包含該資料庫的叢集。 |
Azure Data Explorer Web UI | 默認資料庫是連接 窗格中選取的資料庫,而目前的叢集是包含該資料庫的叢集。 |
用戶端程式庫 | 預設資料庫和叢集是由 Data Source Kusto 連接字串的 和 Initial Catalog 屬性所指定。 |
執行跨叢集或跨資料庫查詢
若要在內容中存取資料庫外部的實體,請使用 cluster () 和 database () 函式來限定實體名稱。
針對相同叢集內不同資料庫中的數據表:
database("<DatabaseName>").<TableName>
針對遠端叢集中的數據表:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
注意
若要執行查詢,您必須擁有預設資料庫的檢視者許可權,以及查詢中所參考的任何其他資料庫。 如需詳細資訊,請參閱 Kusto 角色型訪問控制。
提示
從查詢傳回的記錄數目預設會受到限制,即使沒有特定的 運算符使用 take
也一樣。 若要提高此限制,請使用 notruncation
用戶端要求選項。 如需詳細資訊,請參閱查詢限制。
限定名稱和等位運算元
當 限定名稱 顯示為 等位運算子的操作數時,可以使用通配符來指定多個數據表和多個資料庫。 叢集名稱中不允許使用萬用字元。
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
注意
預設資料庫的名稱也是可能的相符專案,因此 database("*")
會指定所有資料庫的所有數據表,包括預設值。
限定名稱並限制存取語句
限定名稱或模式也可以包含在 限制存取 語句中。 不允許叢集名稱中的通配符。
下列查詢會限制下列實體的查詢存取:
- 預設資料庫中以 my... 開頭的任何實體名稱。
- 目前叢集名為 MyOther... 的所有資料庫的任何資料表。
- 在叢集 OtherCluster.kusto.windows.net 中名為 my2... 的所有資料庫的任何資料表。
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
處理遠端實體的架構變更
若要處理跨叢集查詢,執行初始查詢解譯的叢集必須具有遠端叢集上參考之實體的架構。 若要取得這項資訊,系統會傳送命令來擷取架構,然後儲存在快取中。
在遠端叢集中發生架構變更時,快取的架構可能會過期。 這可能會導致不想要的效果,包括新的或刪除數據行造成 Partial query failure
的情況。 若要解決這類問題,請使用 .clear cache remote-schema 命令手動重新整理架構。
函數和檢視
函式和檢視 (持續性和建立的內嵌) 可以跨資料庫和叢集界限參考資料表。 下列程式碼是有效的。
let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...
您可以從相同叢集中的另一個資料庫存取持續性函式和檢視。
例如,假設您在資料庫中 OtherDb
建立下清單格式函數 (檢視) :
.create function MyView(v:string) { Table1 | where Column1 has v ... }
然後,您會在資料庫中 OtherDb
建立下列純量函式:
.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }
在預設資料庫中,這些實體可以參考如下:
database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
跨叢集函式呼叫的限制
表格式函式或檢視可以跨叢集參考。 適用下列限制:
- 遠端函式必須傳回表格式架構。 純量函式只能在相同的叢集中存取。
- 遠端函式只能接受純量自變數。 取得一或多個資料表引數的函式只能在相同的叢集中存取。
- 遠端函式的結果架構必須事先修正 (已知,而不需執行查詢) 的部分。
這可排除使用查詢建構,例如
pivot
外掛程式。 (請注意,某些外掛程式,例如bag_unpack
外掛程式,支援靜態表示結果架構的方法,而且在此形式中 ,它可用於 跨叢集函數調用。) - 基於效能考量,在初始呼叫之後,呼叫叢集會快取遠端實體的結構描述。 因此,對遠端實體所做的變更可能會導致與快取的結構描述資訊不相符,進而導致查詢失敗。 如需詳細資訊,請參閱跨叢集查詢和結構描述變更。
範例
下列跨叢集呼叫是有效的。
cluster("OtherCluster").database("SomeDb").MyView("exception") | count
下列查詢會呼叫遠端純量函式 MyCalc
。
此呼叫違反規則 #1,因此無效。
MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
下列查詢會呼叫遠端函式 MyCalc
,並提供表格式參數。
此呼叫違反規則 #2,因此無效。
cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
下列查詢會呼叫遠端函式 SomeTable
,此函式具有以參數 tablename
為基礎的變數結構描述輸出。
此呼叫違反規則 #3,因此無效。
OtherDb
中表格式函式。
.create function SomeTable(tablename:string) { table(tablename) }
在預設資料庫中。
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
下列查詢會呼叫遠端函式 GetDataPivot
,此函式具有以資料 (pivot() 外掛程式具有動態輸出) 為基礎的變數結構描述輸出。
此呼叫違反規則 #3,因此無效。
OtherDb
中表格式函式。
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
預設資料庫中的表格式函式。
cluster("OtherCluster").database("OtherDb").GetDataPivot()
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應