跨群集联接
跨群集联接涉及联接驻留在不同群集中的数据集中的数据。
在跨群集联接中,可以在三个可能的位置执行查询,每个位置都有一个特定的指定,供整个文档参考:
- 本地群集:请求发送到的群集,也称为在上下文中托管数据库的群集。
- 左群集:在联接操作左侧托管数据的群集。
- 右群集:在联接操作右侧托管数据的群集。
运行查询的群集从另一个群集中提取数据。
注意
如果联接操作左侧和右侧的数据托管在同一群集中,则不会将其视为跨群集联接,即使数据托管在本地群集外部也是如此。
语法
[ cluster(
ClusterName).database(
DatabaseName).
]LeftTable |
...
|
join
[ hint.remote=
策略 ] (
[ cluster(
ClusterName).database(
DatabaseName).
]RightTable |
...
)
on Conditions
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
LeftTable | string |
✔️ | 要合并其行的左侧表或表格表达式。 表示为 $left 。 |
策略 | string |
确定要对其执行联接的群集。 支持的值为 left 、right 、local 和 auto 。 有关详细信息,请参阅策略。 |
|
ClusterName | string |
如果联接的数据驻留在本地群集外部,请使用 cluster() 函数指定群集。 | |
DatabaseName | string |
如果联接的数据驻留在本地数据库上下文外部,请使用 database() 函数指定数据库。 | |
RightTable | string |
✔️ | 要合并其行的右侧表或表格表达式。 表示为 $right 。 |
条件 | string |
✔️ | 确定 LeftTable 中的行如何与 RightTable 中的行匹配。 如果要匹配的列在这两个表中具有相同的名称,请使用 ON ColumnName 语法。 否则,请使用 ON $left. LeftColumn == $right. RightColumn 语法。 若要指定多个条件,可以使用“and”关键字,也可以使用逗号分隔它们。 如果使用逗号,则将使用“and”逻辑运算符来计算条件。 |
策略
以下列表说明了 Strategy 参数支持的值:
left
:在左侧表的群集或左侧群集上执行联接。right
:在右侧表的群集或右侧群集上执行联接。local
:在当前群集的群集或本地群集上执行联接。auto
:(默认)Kusto 做出远程处理决策。
注意
如果提示的策略不适用于联接操作,则将忽略联接远程处理提示。
auto 策略的工作原理
默认情况下,auto
策略应根据以下规则确定在何处执行跨群集联接:
- 如果其中一个表托管在本地群集中,则在本地群集上执行联接。
- 如果两个表都托管在本地群集外部,则在右侧群集上执行联接。
请开考虑以下示例:
// Example 1
T | ... | join (cluster("B").database("DB").T2 | ...) on Col1
// Example 2
cluster("B").database("DB").T | ... | join (cluster("C").database("DB2").T2 | ...) on Col1
使用 auto
策略时,“示例 1”将在本地群集上执行。 在“示例 2”中,假设两个群集都不是本地群集,则将在右侧群集上执行联接。
性能注意事项
为了获得最佳性能,我们建议在包含最大表的群集上运行查询。
让我们再次考虑以下示例:
// Example 1
T | ... | join (cluster("B").database("DB").T2 | ...) on Col1
// Example 2
cluster("B").database("DB").T | ... | join (cluster("C").database("DB2").T2 | ...) on Col1
“示例 1”设置为在本地群集上运行,但如果 T | ...
生成的数据集小于 cluster("B").database("DB").T2 | ...
生成的数据集,则在群集 B
(在这种情况下为右侧群集)上执行联接操作会比在本地群集上更高效。
以下查询使用 right
策略执行此操作。 使用 right
策略时,即使左侧表位于本地群集中,也会在右侧群集上执行联接操作。
T | ... | join hint.remote=right (cluster("B").database("DB").T2 | ...) on Col1