Соединение между кластерами

Объединение между кластерами предполагает объединение данных из наборов данных, которые находятся в разных кластерах.

В межкластичном соединении запрос может выполняться в трех возможных расположениях, каждое из которых имеет определенное обозначение для ссылки в этом документе:

  • Локальный кластер. Кластер, в который отправляется запрос, который также называется кластером, в котором размещается база данных в контексте.
  • Левый кластер: кластер, в котором размещаются данные в левой части операции соединения.
  • Правый кластер. Кластер, в котором размещаются данные в правой части операции соединения.

Кластер, выполняющий запрос, извлекает данные из другого кластера.

Примечание

Если данные слева и справа от операции соединения размещаются в одном кластере, они не считаются межкластивным соединением, даже если данные размещаются за пределами локального кластера.

Синтаксис

[ 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. Если столбцы, которые нужно сопоставить, имеют одинаковые имена в обеих таблицах, используйте синтаксис ONColumnName. В противном случае используйте синтаксис ON $left.LeftColumn==$right.RightColumn. Чтобы указать несколько условий, можно использовать ключевое слово "и" или разделять их запятыми. Если используются запятые, условия вычисляются с помощью логического оператора "и".

Стратегии

В следующем списке приведены поддерживаемые значения для параметра Strategy :

  • left: выполните соединение в кластере левой таблицы или левого кластера.
  • right: выполните соединение в кластере правой таблицы или правого кластера.
  • local: выполните соединение в кластере текущего кластера или локальном кластере.
  • auto: (По умолчанию) Kusto принимает решение о удаленном взаимодействии.

Примечание

Указание удаленного взаимодействия соединения игнорируется, если указанная стратегия не применима к операции соединения.

Принцип работы автоматической стратегии

По умолчанию стратегия определяет, 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

Эта возможность не поддерживается в Azure Monitor