你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

跨群集或跨数据库查询

适用于:✅Microsoft Fabric✅Azure 数据资源管理器Azure MonitorMicrosoft✅ Sentinel

查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用了实体而没有指定群集或数据库,则会根据此数据库进行解析。

查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用实体而不指定上下文,则会针对此数据库解析该实体。

本文说明了如何执行涉及位于当前上下文数据库之外的实体查询。

先决条件

在上下文中识别群集和数据库

标识上下文中的 eventhouse 和数据库

下表说明了如何通过查询环境在上下文中识别数据库。

环境 上下文中的数据库
Kusto Explorer 默认数据库是在连接面板中选择的数据库,当前群集是包含该数据库的群集。
Azure 数据资源管理器 Web UI 默认数据库是在连接窗格中选择的数据库,当前群集是包含该数据库的群集。
客户端库 通过 Kusto 连接字符串Data SourceInitial Catalog 属性指定默认数据库和群集。
环境 上下文中的数据库/Eventhouse
Kusto Explorer 默认数据库是连接面板中选择的数据库,当前事件库是包含该数据库的 eventhouse。
实时智能 KQL 查询集 默认数据库是直接或通过 eventhouse 选择的当前数据库。
客户端库 使用数据库 URI 指定默认数据库,用于 Data Source Kusto 连接字符串 的属性。 对于 eventhouse,请使用其群集 URI。 可以通过在所选事件屋的“事件屋详细信息”部分选择“系统概述”来找到它。

执行跨群集或跨数据库查询

执行跨事件库或跨数据库查询

要在上下文中访问数据库之外的实体,请使用 cluster()database() 函数限定实体名称。

对于同一群集中不同数据库中的表:

database("<DatabaseName>").<TableName>

对于远程群集中的表:

cluster("<ClusterName>").database("<DatabaseName>").<TableName>

对于同一事件库中不同数据库中的表:

database("<DatabaseName>").<TableName>

对于远程事件屋或远程服务(如 Azure 数据资源管理器)群集中的表:

cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>

注意

若要执行查询,必须对默认数据库和查询中引用的其他所有数据库具有查看权限。 有关详细信息,请参阅 Kusto 基于角色的访问控制

提示

默认情况下,从查询返回的记录数是有限的,即使没有特别使用 take 运算符。 若要提升此限制,请使用 notruncation 客户端请求选项。 有关详细信息,请参阅查询限制

限定名称和 union 运算符

限定名称”显示为 union 运算符的操作数时,可以使用通配符来指定多个表和多个数据库。 群集名称中不允许使用通配符。

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*

限定名称”显示为 union 运算符的操作数时,可以使用通配符来指定多个表和多个数据库。 事件屋名称中不允许使用通配符。

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*

注意

默认数据库的名称也是潜在匹配项,因此数据库 database("*") 指定所有数据库(包括默认数据库)的所有表。

限定名称和限制访问语句

限定名称或模式也可以包含在限制访问语句中。 群集名称中不允许使用通配符。

不允许在事件屋名称中使用通配符。

以下查询将限制对以下实体的查询访问:

  • 从默认数据库中的“my...”开始的任何实体名称。
  • 当前群集的所有名为“MyOther...”的数据库中的任何表。
  • 群集中所有名为 my2... 的数据库中的任何表 OtherCluster.kusto.windows.net
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • 默认数据库中以事件开头的任何实体名称。
  • 当前 eventhouse 的所有数据库中的所有名为 EventOther... 的任何表。
  • 事件屋 OtherEventhouse.kusto.data.microsoft.com 的所有数据库中名为 event2... 的任何表。
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

处理远程实体的架构更改

要处理跨群集查询,执行初始查询解释的群集需要具有远程群集上引用的实体架构。 为了获得这些信息,系统将发送命令来检索架构,然后将这些架构存储在缓存中。

如果远程群集中的架构发生更改,缓存的架构可能会过时。 这可能会导致不期望的效果,包括新列或已删除列导致 Partial query failure 的情况。 若要解决此类问题,请使用 .clear cache remote-schema 命令手动刷新架构。

若要处理跨事件屋或 eventhouse-to-ADX 群集查询,执行初始查询解释的 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 中创建以下表格函数(视图):

.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 中创建以下表格函数(视图):

.create function EventView(v:string) { Table1 | where Column1 has v ...  }  

然后,在数据库 OtherDb 中创建以下标量函数:

.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }  

例如,假设在数据库 OtherDb 中创建以下表格函数(视图):

.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 插件)支持静态指示结果架构的方式,并且它以这种形式用于跨群集函数调用。
  • 出于性能考虑,调用群集会在首次调用后缓存远程实体的架构。 因此,对远程实体所做的更改可能会导致与缓存的架构信息不匹配,从而可能会导致查询失败。 有关详细信息,请参阅跨群集查询和架构更改

跨事件库函数调用的限制

表格函数或视图可以在事件屋之间引用。 以下限制适用:

  • 远程函数必须返回表格架构。 只能在同一个事件库中访问标量函数。
  • 远程函数只能接受标量参数。 只能在同一个事件库中访问获取一个或多个表参数的函数。
  • 远程函数的结果架构必须是固定的(事先已知,而无需执行部分查询)。 因此不能使用 pivot 插件等查询构造。 某些插件(如 bag_unpack 插件)支持静态指示结果架构的方法,并且这种形式 可用于 跨 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"] )

以下跨事件屋调用有效。

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() plugin 具有动态输出)的可变架构输出。 此调用违反规则 #3,因此无效。

OtherDb 中的表格函数。

.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }  

默认数据库中的表格函数。

cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()