Команда .update table (предварительная версия)

Команда .update table выполняет обновление данных в указанной таблице путем атомарного удаления и добавления записей.

Предупреждение

Эта команда невосстановима.

Примечание

При выполнении .update table команды в таблице, которая является источником политики обновления, эта команда активирует эти политики обновления, .update table для которых изменяемая таблица является источником политики обновления.

Одной командой можно удалить до 5 миллионов записей.

Разрешения

Для выполнения этой команды необходимо иметь по крайней мере разрешения на Администратор таблиц.

Синтаксис

Существует два варианта синтаксиса: упрощенный синтаксис и расширенный синтаксис.

Дополнительные сведения о соглашениях о синтаксисе.

Расширенный синтаксис

Расширенный синтаксис обеспечивает гибкость при определении запроса для удаления строк и другого запроса для добавления строк:

.updatetableTablenamedeleteDeleteIdentifierappendAppendIdentifier [with(propertyName=propertyValue)] <|
letDeleteIdentifier=DeletePredicate;
letAppendIdentifier=AppendPredicate;

Параметры расширенного синтаксиса

Имя Тип Обязательно Описание
TableName string ✔️ Имя обновляемой таблицы.
DeleteIdentifier string ✔️ Имя идентификатора, используемое для указания предиката удаления, применяемого к обновленной таблице.
DeletePredicate string ✔️ Текст запроса, результаты которого используются в качестве данных для удаления. Предикат удаления должен содержать по крайней мере один where оператор и может использовать только следующие операторы: extend, where, projectjoin и lookup.
AppendIdentifier string ✔️ Имя идентификатора, используемое для указания предиката добавления, применяемого к обновленной таблице.
AppendPredicate string ✔️ Текст запроса, результаты которого используются в качестве данных для добавления.

Важно!

  • Предикаты удаления и добавления не могут использовать удаленные сущности, сущности между базами данных и между кластерами. Предикаты не могут ссылаться на внешнюю таблицу externaldata или использовать оператор .
  • Ожидается, что запросы на добавление и удаление будут давать детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован только в том случае, если он будет возвращать одни и те же данные, если он выполняется несколько раз.
  • Запросы могут выполняться несколько раз в рамках update выполнения. Если промежуточные результаты запроса несогласованы, команда обновления может привести к непредвиденным результатам.

Упрощенный синтаксис

Для упрощенного синтаксиса требуется запрос на добавление, а также ключ. Ключ — это столбец в таблице, представляющий уникальные значения в таблице. Этот столбец используется для определения строк, которые следует удалить из таблицы. Выполняется соединение между исходной таблицей и запросом на добавление, чтобы определить строки, которые согласуются со значением по отношению к этому столбцу.

.updatetableTableName в IDColumnName [with(propertyName=propertyValue)] <|
appendQuery

Параметры упрощенного синтаксиса

Имя Тип Обязательно Описание
TableName string ✔️ Имя обновляемой таблицы.
IDColumnName string ✔️ Имя столбца, определяющего строки. Столбец должен присутствовать как в таблице, так и в appendQuery.
appendQuery string ✔️ Текст запроса или команды управления, результаты которой используются в качестве данных для добавления. Схема запроса должна совпадать со схемой таблицы.

Важно!

  • Запрос на добавление не может использовать удаленные сущности, сущности cross-db и cross-cluster, ссылаться на внешнюю таблицу externaldata или использовать оператор .
  • Ожидается, что запрос на добавление даст детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован только в том случае, если он возвращает одни и те же данные, если он выполняется несколько раз.
  • Запросы могут выполняться несколько раз в рамках update выполнения. Если промежуточные результаты запроса несогласованы, команда обновления может привести к непредвиденным результатам.

Поддерживаемые свойства

Имя Тип Описание
Whatif bool Если trueзначение , возвращает количество записей, которые будут добавлены или удалены в каждом сегменте, без добавления или удаления записей. Значение по умолчанию — false.

Важно!

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

Возвращаемое значение

Результатом выполнения команды является таблица, в которой каждая запись представляет экстент , который был создан с новыми данными или был удален.

Имя Тип Описание
Таблица string Таблица, в которой был создан или удален экстент.
Действие string Создание или удаление в зависимости от действия, выполняемого в экстенте.
ExtentId guid Уникальный идентификатор экстента, который был создан или удален командой .
RowCount long Количество строк, созданных или удаленных в заданном экстенте командой .

Выбор между .update table и материализованными представлениями

Существуют сценарии, в которых для достижения той же цели в таблице можно использовать .update table команду или материализованное представление . Например, материализованное представление может использоваться для сохранения последней версии каждой записи или обновление может использоваться для обновления записей при наличии новой версии.

Используйте следующие рекомендации, чтобы решить, какой метод использовать:

  • Если шаблон обновления не поддерживается материализованными представлениями, используйте команду update.
  • Если исходная таблица имеет большой объем приема, но только несколько обновлений, использование команды обновления может быть более производительным и потреблять меньше кэша или хранилища, чем материализованные представления. Это связано с тем, что материализованным представлениям необходимо повторно обработать все данные приема, что менее эффективно, чем определение отдельных записей для обновления на основе предикатов добавления или удаления.
  • Материализованные представления — это полностью управляемое решение. Материализованное представление определяется один раз , и система выполняет материализацию в фоновом режиме. Для выполнения команды обновления требуется оркестрированный процесс (например, Фабрика данных Azure, Logic Apps, Power Automate и другие), который явно выполняет команду обновления при каждом обновлении. Если материализованные представления работают достаточно хорошо для вашего варианта использования, использование материализованных представлений требует меньше управления и обслуживания.

Примеры— упрощенный синтаксис

В следующих примерах используется упрощенный синтаксис.

Общий пример

Создается следующая таблица.

.set-or-replace People <|
datatable(Name:string, Address:string)[
  "Alice", "221B Baker street",
  "Bob", "1600 Pennsylvania Avenue",
  "Carl", "11 Wall Street New York"
]
Название Адрес
Алиса 221B Бейкер-стрит
Bob 1600 Пенсильвания-авеню
Карл 11 Уолл-стрит Нью-йорк

Затем выполняется следующая команда update:

.update table People on Name <|
  datatable(Name:string, Address:string)[
  "Alice", "2 Macquarie Street",
  "Diana", "350 Fifth Avenue" ]

Где appendQuery возвращает следующий результирующий набор:

Название Адрес
Алиса 2 Маккуори-стрит
Диана 350 Пятая авеню

Так как мы обновилиName столбец, строка Алиса будет удалена, а таблица после обновления будет выглядеть следующим образом:

Название Адрес
Алиса 2 Маккуори-стрит
Bob 1600 Пенсильвания-авеню
Карл 11 Уолл-стрит Нью-йорк
Диана 350 Пятая авеню

Обратите внимание, что Диана не найдена в исходной таблице. Это допустимо, и соответствующая строка не была удалена.

Аналогичным образом, если бы в исходной таблице было несколько строк с именем Алисы , все они были бы удалены и заменены одной строкой Алисы , которую мы получили в конце.

Пример таблицы

Следующие примеры основаны на следующей таблице:

.set-or-replace Employees <|
  range i from 1 to 100 step 1
  | project Id=i
  | extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
  | extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])

Эта команда создает таблицу со 100 записями, начиная с:

ID Код Color
1 Сотрудник Синий
2 Customer Серый
3 Сотрудник Красный
4 Customer Синий
5 Сотрудник Серый
6 Customer Красный
6 Сотрудник Синий

Обновление одного столбца в одной строке

В следующем примере используется упрощенный синтаксис для обновления одного столбца в одной строке, которая соответствует предикату добавления:

.update table Employees on Id with(whatif=true) <|
    Employees
    | where Id==3
    | extend Color="Orange"

Обратите внимание, что whatif для задано значение true. После этого запроса таблица не изменяется, но команда возвращает, что будет удален экстент с одной строкой и новый экстент с одной строкой.

На самом деле обновление выполняется с помощью следующей команды:

.update table Employees on Id <|
  Employees
  | where Id==3
  | extend Color="Orange"

Обновление одного столбца в нескольких строках

В следующем примере в одном столбце Color обновляется значение Green в тех строках, которые соответствуют предикату добавления.

.update table Employees on Id <|
  Employees
  | where Code=="Employee"
  | where Color=="Blue"
  | extend Color="Green"

Обновление нескольких столбцов в нескольких строках

В следующем примере обновляется несколько столбцов во всех строках, соответствующих предикату добавления.

.update table Employees on Id <|
  Employees
  | where Color=="Gray"
  | extend Code=strcat("ex-", Code)
  | extend Color=""

Обновление строк с помощью другой таблицы

В этом примере первым шагом является создание следующей таблицы сопоставления:

.set-or-replace ColorMapping <|
  datatable(OldColor:string, NewColor:string)[
    "Red", "Pink",
    "Blue", "Purple",
    "Gray", "LightGray",
    "Orange", "Yellow",
    "Green", "AppleGreen"
  ]

Затем эта таблица сопоставления используется для обновления некоторых цветов в исходной таблице на основе предиката добавления и соответствующего "Нового цвета":

.update table Employees on Id <|
  Employees
  | where Code=="Customer"
  | lookup ColorMapping on $left.Color==$right.OldColor
  | project Id, Code, Color=NewColor

Обновление строк с помощью промежуточной таблицы

Популярный шаблон — сначала помещать данные в промежуточную таблицу перед обновлением main таблицы.

Первая команда создает промежуточную таблицу:

.set-or-replace MyStagingTable <|
    range i from 70 to 130 step 5
    | project Id=i
    | extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
    | extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])

Следующая команда обновляет таблицу main данными из промежуточной таблицы:

.update table Employees on Id <|
  MyStagingTable

Некоторые записи в промежуточной таблице не существовали в таблице main (т. е. имели Id>100), но были по-прежнему вставлены в таблицу main (поведение upsert).

Примеры. Расширенный синтаксис

В следующих примерах используется синтаксис Expanded.

Составной ключ

Упрощенный синтаксис предполагает, что один столбец может сопоставлять строки в appendQuery для вывода удаляемых строк. Например, с помощью составных ключей можно использовать несколько столбцов.

Первая команда создает таблицу со составными ключами:

.set-or-replace VersionedArticle <|
  datatable(ArticleId:string, Version:int, Detail:string)[
    "A", 1, "Early version",
    "B", 1, "News about mobiles",
    "C", 1, "Opinion article",
    "B", 2, "Revision about brand X",
    "B", 3, "Revision about brand Y",
    "C", 2, "Fact check"
  ]

Следующая команда обновляет определенную запись с помощью расширенного синтаксиса:

.update table VersionedArticle delete D append A <|
  let D = VersionedArticle
    | where ArticleId=="B"
    | where Version==3;
  let A = VersionedArticle
    | where ArticleId=="B"
    | where Version==3
    | extend Detail = "Revision about brand Z";

Полный контроль

В следующем примере удаляются все строки с Codeemployee , а строки с CodeemployeeиColor purple добавляются. Удаляется больше строк, чем вставлено.

.update table Employees delete D append A <|
  let D = Employees
    | where Code=="Employee";
  let A = Employees
    | where Code=="Employee"
    | where Color=="Purple"
    | extend Code="Corporate"
    | extend Color="Mauve";

Этот тип действия возможен только с помощью расширенного синтаксиса, который независимо управляет операциями удаления и добавления.