跨叢集與跨資料庫查詢
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
查詢會以指定為 內容中的資料庫的特定資料庫執行。 此資料庫會作為許可權檢查的預設值。 如果在查詢中參考實體而不指定叢集或資料庫,則會針對此資料庫解析該實體。
查詢會以指定為 內容中的資料庫的特定資料庫執行。 此資料庫會作為許可權檢查的預設值。 如果在查詢中參考實體而不指定內容,則會針對此資料庫解析該實體。
本文說明如何執行涉及位於目前內容資料庫外部實體的查詢。
必要條件
- 如果叢集位於不同的租使用者中,請遵循允許跨租用戶查詢和命令中的指示。
識別內容中的叢集和資料庫
識別內容中的 eventhouse 和資料庫
下表說明如何依查詢環境識別內容中的資料庫。
Environment | 內容中的資料庫 |
---|---|
Kusto Explorer | 默認資料庫是連接面板中選取的資料庫,而目前的叢集是包含該資料庫的叢集。 |
Azure 數據總管 Web UI | 默認資料庫是連接窗格中選取的資料庫,而目前的叢集是包含該資料庫的叢集。 |
用戶端程式庫 | 依 Data Source Kusto 連接字串 的 和 Initial Catalog 屬性指定預設資料庫和叢集。 |
Environment | 內容中的資料庫/Eventhouse |
---|---|
Kusto Explorer | 默認資料庫是連接面板中選取的資料庫,而目前的 eventhouse 是包含該資料庫的 eventhouse。 |
即時智慧 KQL 查詢集 | 默認資料庫是直接或透過 Eventhouse 選取的目前資料庫。 |
用戶端程式庫 | 使用資料庫 URI 指定預設資料庫,以用於 Data Source Kusto 連接字串 的屬性。 針對 eventhouse,請使用其叢集 URI。 您可以在選取事件屋的 [事件屋詳細資料] 區段中選取 [系統概觀] 來找到它。 |
執行跨叢集或跨資料庫查詢
執行跨事件倉儲或跨資料庫查詢
若要在內容中存取資料庫外部的實體,請使用 cluster() 和 database() 函式來限定實體名稱。
針對相同叢集中不同資料庫中的數據表:
database("<DatabaseName>").<TableName>
針對遠端叢集中的數據表:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
針對相同 eventhouse 內不同資料庫中的數據表:
database("<DatabaseName>").<TableName>
針對遠端事件倉儲或遠端服務中的數據表(例如 Azure 數據總管) 叢集:
cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>
注意
若要執行查詢,您必須擁有預設資料庫的查看器許可權,以及查詢中參考的每個其他資料庫。 如需詳細資訊,請參閱 Kusto 角色型存取控制。
提示
從查詢傳回的記錄數目預設會受到限制,即使沒有特定的運算符使用 take
也一樣。 若要提高此限制,請使用 notruncation
用戶端要求選項。 如需詳細資訊,請參閱查詢限制。
限定名稱和等位運算元
當限定名稱顯示為等位運算子的操作數時,可以使用通配符來指定多個數據表和多個資料庫。 叢集名稱中不允許通配符。
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
當限定名稱顯示為等位運算子的操作數時,可以使用通配符來指定多個數據表和多個資料庫。 事件屋名稱中不允許通配符。
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*
注意
預設資料庫的名稱也是可能的相符專案,因此 database("*")
指定所有資料庫的所有數據表,包括預設值。
限定的名稱和限制存取語句
限定的名稱或模式也可以包含在 restrict access 語句中。 不允許叢集名稱中的通配符。
不允許 Eventhouse 名稱中的通配符。
下列查詢會限制對下列實體的查詢存取:
- 默認資料庫中以 my... 開頭的任何實體名稱。
- 目前叢集所有資料庫中名為 MyOther... 的所有數據表。
- 叢集中所有資料庫中名為 my2... 的所有資料表 OtherCluster.kusto.windows.net。
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
- 默認資料庫中任何開頭為 event... 的實體名稱。
- 目前 eventhouse 之所有資料庫中名為 EventOther... 的所有數據表。
- 所有資料庫中 名為 event2... 的所有數據表,都會在 eventhouse 中 OtherEventhouse.kusto.data.microsoft.com。
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);
處理遠端實體的架構變更
若要處理跨叢集查詢,執行初始查詢解譯的叢集必須具有遠端叢集上所參考實體的架構。 若要取得這項資訊,系統會傳送命令來擷取架構,然後儲存在快取中。
如果遠端叢集中有架構變更,快取的架構可能會過時。 這可能會導致不想要的效果,包括新的或刪除數據行造成 的情況 Partial query failure
。 若要解決這類問題,請使用 .clear cache remote-schema 命令手動重新整理架構。
若要處理跨 eventhouse 或 eventhouse-to-ADX 叢集查詢,執行初始查詢解譯的 eventhouse 必須具有遠端 eventhouse 或叢集上參考的實體架構。 若要取得這項資訊,系統會傳送命令來擷取架構,然後儲存在快取中。
如果有遠端架構變更,快取的架構可能會過時。 這可能會導致不想要的效果,包括新的或刪除數據行造成 的情況 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
建立下清單格式函式 (view) :
.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
函式和檢視表(持續性和建立的內嵌)可以跨資料庫和事件存放區界限參考數據表。 下列程序代碼有效。
let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...
您可以從相同事件倉儲中的另一個數據庫存取持續性函式和檢視。
例如,假設您在資料庫中 OtherDb
建立下清單格式函式 (view) :
.create function EventView(v:string) { Table1 | where Column1 has v ... }
然後,您會在資料庫中 OtherDb
建立下列純量函式:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
例如,假設您在資料庫中 OtherDb
建立下清單格式函式 (view) :
.create function EventView(v:string) { Table1 | where Column1 has v ... }
然後,您會在資料庫中 OtherDb
建立下列純量函式:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
在默認資料庫中,可以參考這些實體,如下所示:
database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10
跨叢集函式呼叫的限制
表格式函式或檢視可以在叢集之間參考。 適用下列限制:
- 遠端函式必須傳回表格式架構。 純量函式只能在相同的叢集中存取。
- 遠端函式只能接受純量自變數。 取得一或多個數據表自變數的函式只能在相同的叢集中存取。
- 遠端函式的結果架構必須固定(事先知道,而不執行查詢的部分)。 因此無法使用外掛程式之類的
pivot
查詢建構。 某些外掛程式,例如bag_unpack
外掛程式,支援以靜態方式指出結果架構的方法,而且這種形式 可用於 跨叢集函式呼叫。 - 基於效能考慮,呼叫叢集會在初始呼叫之後快取遠端實體的架構。 因此,對遠端實體所做的變更可能會導致快取的架構資訊不符,這可能會導致查詢失敗。 如需詳細資訊,請參閱 跨叢集查詢和架構變更。
跨 eventhouse 函式呼叫的限制
表格式函式或檢視可以跨事件集區參考。 適用下列限制:
- 遠端函式必須傳回表格式架構。 純量函式只能在相同的事件倉儲中存取。
- 遠端函式只能接受純量自變數。 取得一或多個數據表自變數的函式只能在相同的 eventhouse 中存取。
- 遠端函式的結果架構必須固定(事先知道,而不執行查詢的部分)。 因此無法使用外掛程式之類的
pivot
查詢建構。 某些外掛程式,例如bag_unpack
外掛程式,支援以靜態方式指出結果架構的方法,而且這種形式 可用於 跨 eventhouse 函式呼叫。 - 基於效能考慮,呼叫的 eventhouse 會在初始呼叫之後快取遠端實體的架構。 因此,對遠端實體所做的變更可能會導致快取的架構資訊不符,這可能會導致查詢失敗。 如需詳細資訊,請參閱 跨叢集查詢和架構變更。
範例
下列跨叢集呼叫有效。
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"] )
下列跨 eventhouse 呼叫有效。
cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count
下列查詢會呼叫遠端純量函式 EventCalc
。
此呼叫違反規則 #1,因此無效。
Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
下列查詢會呼叫遠端函 EventCalc
式,並提供表格式參數。
此呼叫違反規則 #2,因此無效。
cluster("EventhouseClusterURI").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")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")
下列查詢會呼叫遠端函式 GetDataPivot
,此函式會根據資料 (pivot() 外掛程式 具有動態輸出的變數架構輸出。
此呼叫違反規則 #3,因此無效。
中的 OtherDb
表格式函式。
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
預設資料庫中的表格式函式。
cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()