跨群集或跨数据库查询

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

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

先决条件

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

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

环境 上下文中的数据库
Kusto Explorer 默认数据库是在连接面板中选择的数据库,当前群集是包含该数据库的群集。
Azure 数据资源管理器 Web UI 默认数据库是在连接窗格中选择的数据库,当前群集是包含该数据库的群集。
客户端库 默认数据库和群集由 Kusto 连接字符串Data SourceInitial 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()