跨群集或跨数据库查询
查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用了实体而没有指定群集或数据库,则会根据此数据库进行解析。
本文说明了如何执行涉及位于当前上下文数据库之外的实体查询。
先决条件
- 如果群集位于不同租户中,请按照允许跨租户查询和命令中的说明进行操作。
在上下文中识别群集和数据库
下表说明了如何通过查询环境在上下文中识别数据库。
环境 | 上下文中的数据库 |
---|---|
Kusto Explorer | 默认数据库是在连接面板中选择的数据库,当前群集是包含该数据库的群集。 |
Azure 数据资源管理器 Web UI | 默认数据库是在连接窗格中选择的数据库,当前群集是包含该数据库的群集。 |
客户端库 | 通过 Kusto 连接字符串的 Data Source 和 Initial Catalog 属性指定默认数据库和群集。 |
执行跨群集或跨数据库查询
要在上下文中访问数据库之外的实体,请使用 cluster() 和 database() 函数限定实体名称。
对于同一群集中不同数据库中的表:
database("<DatabaseName>").<TableName>
对于远程群集中的表:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
注意
若要执行查询,必须对默认数据库和查询中引用的其他所有数据库具有查看权限。 有关详细信息,请参阅 Kusto 基于角色的访问控制。
提示
默认情况下,从查询返回的记录数是有限的,即使没有特别使用 take
运算符。 若要提升此限制,请使用 notruncation
客户端请求选项。 有关详细信息,请参阅查询限制。
限定名称和 union 运算符
“限定名称”显示为 union 运算符的操作数时,可以使用通配符来指定多个表和多个数据库。 群集名称中不允许使用通配符。
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
注意
默认数据库的名称也是潜在匹配项,因此数据库 database("*")
指定所有数据库(包括默认数据库)的所有表。
限定名称和限制访问语句
限定名称或模式也可以包含在限制访问语句中。 群集名称中不允许使用通配符。
以下查询将限制对以下实体的查询访问:
- 从默认数据库中的“my...”开始的任何实体名称。
- 当前群集的所有名为“MyOther...”的数据库中的任何表。
- “OtherCluster.kusto.chinacloudapi.cn”集群中所有名为“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() plugin 具有动态输出)的可变架构输出。
此调用违反规则 #3,因此无效。
OtherDb
中的表格函数。
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
默认数据库中的表格函数。
cluster("OtherCluster").database("OtherDb").GetDataPivot()