Команда .update table
Область применения: ✅Microsoft Fabric✅Azure Data Explorer
Команда .update table
выполняет обновления данных в указанной таблице путем удаления и добавления записей атомарно.
Предупреждение
Эта команда недоступна.
Примечание.
При выполнении .update table
команды в таблице, являющейся источником политики обновления, команда активирует эти политики обновления, .update table
для которых измененная таблица является источником политики обновления.
Вы можете удалить до 5 миллионов записей в одной команде.
Разрешения
Для выполнения этой команды необходимо иметь по крайней мере разрешения администратора таблицы.
Синтаксис
Примечание.
Упрощенный синтаксис, доступный во время предварительной версии, устарел.
Дополнительные сведения о соглашениях синтаксиса.
.update
[async]
table
TableName delete
DeleteIdentifier AppendIdentifier append
[with
(
propertyName =
propertyValue ] )
<|
let
DeleteIdentifier=
DeletePredicate;
let
AppendIdentifier=
ДобавлениеPredicate;
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
async | string |
Если задано, указывает, что команда выполняется в асинхронном режиме. | |
TableName | string |
✔️ | Имя таблицы для обновления. |
DeleteIdentifier | string |
✔️ | Имя идентификатора, используемое для указания предиката удаления, примененного к обновленной таблице. |
DeletePredicate | string |
✔️ | Текст запроса, результаты которого используются в качестве данных для удаления. Предикат имеет те же ограничения, что и предикат обратимого удаления. |
AppendIdentifier | string |
✔️ | Имя идентификатора, используемое для указания предиката добавления, примененного к обновленной таблице. |
ДобавлениеPredicate | string |
✔️ | Текст запроса, результаты которого используются в качестве данных для добавления. |
Внимание
- Как удалить, так и добавить предикаты не могут использовать удаленные сущности, кросс-db и межкластеризованные сущности. Предикаты не могут ссылаться на внешнюю таблицу или использовать
externaldata
оператор. - Ожидается, что запросы на добавление и удаление создают детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован, если он возвращает одни и те же данные, если они выполняются несколько раз.
- Например, использование
take
оператора,sample
оператора,rand
функции и других таких операторов не рекомендуется, так как эти операторы не детерминированные.
- Например, использование
- Запросы могут выполняться несколько раз в рамках
update
выполнения. Если промежуточные результаты запроса несогласованы, команда обновления может привести к непредвиденным результатам.
Поддерживаемые свойства
Имя. | Тип | Описание |
---|---|---|
whatif | bool | Если true возвращает количество записей, которые будут добавлены или удалены в каждом сегменте, без добавления или удаления записей. Значение по умолчанию — false . |
распределённый | bool | Если true команда выполняет запрос параллельно со всех узлов. По умолчанию — false . Ознакомьтесь с советами по производительности. |
Внимание
Перед выполнением обновления рекомендуется сначала выполнить whatif
обновление перед удалением или добавлением данных перед удалением или добавлением данных.
Возвраты
Результатом команды является таблица, в которой каждая запись представляет степень , созданную с новыми данными или удаленными записями.
Имя. | Тип | Описание |
---|---|---|
Таблицу | string |
Таблица, в которой была создана или удалена экстент. |
Действие | string |
Создание или удаление в зависимости от действия, выполняемого на экстенте. |
ExtentId | guid |
Уникальный идентификатор для экстентов, созданных или удаленных командой. |
RowCount | long |
Количество строк, созданных или удаленных в заданном экстенте командой. |
Выбор между .update table
и материализованными представлениями
Существуют сценарии, в которых можно использовать .update table
команду или материализованное представление для достижения той же цели в таблице. Например, материализованное представление может использоваться для хранения последней версии каждой записи или обновления можно использовать для обновления записей при наличии новой версии.
Используйте следующие рекомендации, чтобы решить, какой метод следует использовать:
- Если шаблон обновления не поддерживается материализованными представлениями, используйте команду обновления.
- Если исходная таблица имеет большой объем приема, но только несколько обновлений, используя команду обновления, может быть более производительной и использовать меньше кэша или хранилища, чем материализованные представления. Это связано с тем, что материализованные представления должны повторно обрабатывать все приемные данные, что менее эффективно, чем определение отдельных записей для обновления на основе добавочных или удаленных предикатов.
- Материализованные представления — это полностью управляемое решение. Материализованное представление определяется один раз и материализация происходит в фоновом режиме системой. Для команды обновления требуется оркестрированный процесс (например, Фабрика данных Azure, Logic Apps, Power Automate и другие), который явно выполняет команду обновления при каждом обновлении. Если материализованные представления работают достаточно для вашего варианта использования, использование материализованных представлений требует меньше управления и обслуживания.
Советы по производительности
- Прием данных — это ресурсоемкая операция, которая может повлиять на параллельные действия в кластере, в том числе на выполнение запросов. Рекомендуется избежать следующих ресурсоемких действий: выполнение нескольких
.update
команд одновременно и интенсивное использование распределенного свойства. - Ограничьте добавляемые данные менее чем на 1 ГБ за операцию. При необходимости используйте несколько команд обновления.
distributed
Установите флагtrue
только в том случае, если объем данных, создаваемых запросом, превышает 1 ГБ и не требует сериализации: несколько узлов могут создавать выходные данные параллельно. Не используйте этот флаг, если результаты запроса небольшие, так как может потребоваться создать множество небольших сегментов данных.
Примеры
В примерах мы будем использовать следующую таблицу:
.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 записями, начиная с:
Идентификатор | Код | Color |
---|---|---|
1 | Код сотрудника | Синий |
2 | Клиент | Серый |
3 | Код сотрудника | Красный |
4 | Клиент | Синий |
5 | Код сотрудника | Серый |
6 | Клиент | Красный |
6 | Код сотрудника | Синий |
Обновление одного столбца в одной строке
В следующем примере обновляется один столбец в одной строке:
.update table Employees delete D append A with(whatif=true) <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
Обратите внимание, что whatif
задано значение true. После этого запроса таблица остается неизменной, но команда возвращает, что будет экстент с одной строкой удалена и новая экстент с одной строкой.
Следующая команда фактически выполняет обновление:
.update table Employees delete D append A <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
Обновление одного столбца в нескольких строках
В следующем примере по одному столбцу Color
обновляется значение Green в тех строках, которые имеют синее значение.
.update table Employees delete D append A <|
let D = Employees
| where Code=="Employee"
| where Color=="Blue";
let A = D
| extend Color="Green";
Здесь мы повторно пользовались идентификатором удаления в определении в предикате добавления.
Обновление нескольких столбцов в нескольких строках
В следующем примере обновляется несколько столбцов во всех строках с цветом серого цвета.
.update table Employees delete D append A <|
let D = Employees
| where Color=="Gray";
let A = D
| 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 delete D append A <|
let D = Employees
| where Code=="Customer";
let A = D
| lookup ColorMapping on $left.Color==$right.OldColor
| project Id, Code, Color=NewColor
Обновление строк с помощью набора данных
Иногда значения для обновления известны без хранения в таблице, а оператор таблицы может оказаться полезным:
.update table Employees delete D append A <|
let A = datatable(Id:long, Code:string, Color:string)[
1, "Customer", "Purple",
2, "Customer", "Magenta",
3, "Customer", "Turquoise",
];
let D = Employees
| join kind=leftsemi A on Id
| where true;
Обновление строк с промежуточной таблицей
Популярный шаблон — сначала приземлить данные в промежуточной таблице перед обновлением основной таблицы.
Первая команда создает промежуточную таблицу:
.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])
Следующая команда обновляет основную таблицу данными в промежуточной таблице:
.update table Employees delete D append A <|
let A = MyStagingTable;
let D = Employees
| join kind=leftsemi MyStagingTable on Id
| where true;
Некоторые записи в промежуточной таблице не существовали в главной таблице (т. е. имелись Id>100
), но все еще были вставлены в основную таблицу (поведение upsert).
Составной ключ
Первая команда создает таблицу с составными ключами:
.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";