Команда .update table (предварительная версия)
Команда .update table
выполняет обновление данных в указанной таблице путем атомарного удаления и добавления записей.
Предупреждение
Эта команда невосстановима.
Примечание
При выполнении .update table
команды в таблице, которая является источником политики обновления, эта команда активирует эти политики обновления, .update table
для которых изменяемая таблица является источником политики обновления.
Одной командой можно удалить до 5 миллионов записей.
Разрешения
Для выполнения этой команды необходимо иметь по крайней мере разрешения на Администратор таблиц.
Синтаксис
Существует два варианта синтаксиса: упрощенный синтаксис и расширенный синтаксис.
Дополнительные сведения о соглашениях о синтаксисе.
Расширенный синтаксис
Расширенный синтаксис обеспечивает гибкость при определении запроса для удаления строк и другого запроса для добавления строк:
.update
table
Tablenamedelete
DeleteIdentifierappend
AppendIdentifier [with
(
propertyName=
propertyValue)
] <|
let
DeleteIdentifier=
DeletePredicate;
let
AppendIdentifier=
AppendPredicate;
Параметры расширенного синтаксиса
Имя | Тип | Обязательно | Описание |
---|---|---|---|
TableName | string |
✔️ | Имя обновляемой таблицы. |
DeleteIdentifier | string |
✔️ | Имя идентификатора, используемое для указания предиката удаления, применяемого к обновленной таблице. |
DeletePredicate | string |
✔️ | Текст запроса, результаты которого используются в качестве данных для удаления. Предикат удаления должен содержать по крайней мере один where оператор и может использовать только следующие операторы: extend , where , project join и lookup . |
AppendIdentifier | string |
✔️ | Имя идентификатора, используемое для указания предиката добавления, применяемого к обновленной таблице. |
AppendPredicate | string |
✔️ | Текст запроса, результаты которого используются в качестве данных для добавления. |
Важно!
- Предикаты удаления и добавления не могут использовать удаленные сущности, сущности между базами данных и между кластерами. Предикаты не могут ссылаться на внешнюю таблицу
externaldata
или использовать оператор . - Ожидается, что запросы на добавление и удаление будут давать детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован только в том случае, если он будет возвращать одни и те же данные, если он выполняется несколько раз.
- Например, не рекомендуется использовать
take
операторы,sample
операторы,rand
функции и другие подобные операторы, так как эти операторы не являются детерминированными.
- Например, не рекомендуется использовать
- Запросы могут выполняться несколько раз в рамках
update
выполнения. Если промежуточные результаты запроса несогласованы, команда обновления может привести к непредвиденным результатам.
Упрощенный синтаксис
Для упрощенного синтаксиса требуется запрос на добавление, а также ключ. Ключ — это столбец в таблице, представляющий уникальные значения в таблице. Этот столбец используется для определения строк, которые следует удалить из таблицы. Выполняется соединение между исходной таблицей и запросом на добавление, чтобы определить строки, которые согласуются со значением по отношению к этому столбцу.
.update
table
TableName в IDColumnName [with
(
propertyName=
propertyValue)
] <|
appendQuery
Параметры упрощенного синтаксиса
Имя | Тип | Обязательно | Описание |
---|---|---|---|
TableName | string |
✔️ | Имя обновляемой таблицы. |
IDColumnName | string |
✔️ | Имя столбца, определяющего строки. Столбец должен присутствовать как в таблице, так и в appendQuery. |
appendQuery | string |
✔️ | Текст запроса или команды управления, результаты которой используются в качестве данных для добавления. Схема запроса должна совпадать со схемой таблицы. |
Важно!
- Запрос на добавление не может использовать удаленные сущности, сущности cross-db и cross-cluster, ссылаться на внешнюю таблицу
externaldata
или использовать оператор . - Ожидается, что запрос на добавление даст детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован только в том случае, если он возвращает одни и те же данные, если он выполняется несколько раз.
- Например, не рекомендуется использовать
take
операторы,sample
операторы,rand
функции и другие подобные операторы, так как эти операторы не являются детерминированными.
- Например, не рекомендуется использовать
- Запросы могут выполняться несколько раз в рамках
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";
Полный контроль
В следующем примере удаляются все строки с Code
employee , а строки с Code
employeeи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";
Этот тип действия возможен только с помощью расширенного синтаксиса, который независимо управляет операциями удаления и добавления.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по