Поделиться через


Команда .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 ] )<|
letDeleteIdentifier= DeletePredicate;
letAppendIdentifier= ДобавлениеPredicate;

Параметры

Имя (название) Type Обязательно Описание
async string Если задано, указывает, что команда выполняется в асинхронном режиме.
TableName string ✔️ Имя таблицы для обновления.
DeleteIdentifier string ✔️ Имя идентификатора, используемое для указания предиката удаления, примененного к обновленной таблице.
DeletePredicate string ✔️ Текст запроса, результаты которого используются в качестве данных для удаления. Предикат имеет те же ограничения, что и предикат обратимого удаления.
AppendIdentifier string ✔️ Имя идентификатора, используемое для указания предиката добавления, примененного к обновленной таблице.
ДобавлениеPredicate string ✔️ Текст запроса, результаты которого используются в качестве данных для добавления.

Внимание

  • Как удалить, так и добавить предикаты не могут использовать удаленные сущности, кросс-db и межкластеризованные сущности. Предикаты не могут ссылаться на внешнюю таблицу или использовать externaldata оператор.
  • Ожидается, что запросы на добавление и удаление создают детерминированные результаты. Недетерминированные запросы могут привести к непредвиденным результатам. Запрос детерминирован, если он возвращает одни и те же данные, если они выполняются несколько раз.
  • Запросы могут выполняться несколько раз в рамках 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";