你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
跨群集或跨数据库查询
适用于:✅Microsoft Fabric✅Azure 数据资源管理器Azure Monitor✅Microsoft✅ Sentinel
查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用了实体而没有指定群集或数据库,则会根据此数据库进行解析。
查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用实体而不指定上下文,则会针对此数据库解析该实体。
本文说明了如何执行涉及位于当前上下文数据库之外的实体查询。
先决条件
- 如果群集位于不同租户中,请按照允许跨租户查询和命令中的说明进行操作。
在上下文中识别群集和数据库
标识上下文中的 eventhouse 和数据库
下表说明了如何通过查询环境在上下文中识别数据库。
环境 | 上下文中的数据库 |
---|---|
Kusto Explorer | 默认数据库是在连接面板中选择的数据库,当前群集是包含该数据库的群集。 |
Azure 数据资源管理器 Web UI | 默认数据库是在连接窗格中选择的数据库,当前群集是包含该数据库的群集。 |
客户端库 | 通过 Kusto 连接字符串的 Data Source 和 Initial 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()