共用方式為


跨叢集與跨資料庫查詢

適用於:✅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()