Перейти к содержимому
Последнее обновление

Модель Unique Key

Модель Unique Key обеспечивает уникальность ключевых столбцов: при вставке или обновлении строки новые данные перезаписывают существующую строку с тем же ключом, поэтому таблица всегда содержит последнюю версию данных. Используйте эту модель, если данные обновляются по первичному ключу.

Когда использовать​

Модель Unique Key подходит для трёх основных сценариев:

  1. Частое обновление данных: синхронизация таблиц измерений в реальном времени из исходных баз данных OLTP, для которой необходимы эффективные операции UPSERT.
  2. Эффективная дедупликация данных: в системах показа рекламы, управления взаимоотношениями с клиентами (CRM) и подобных системах дубликаты записей удаляются по идентификатору пользователя.
  3. Частичное обновление столбцов: при назначении профилям динамических тегов, которые часто меняются, или при обработке заказов, когда меняется статус транзакции, можно обновлять только затронутые столбцы.

Создание таблицы Unique Key​

Объявите первичный ключ с помощью ключевого слова UNIQUE KEY. Merge-on-write включён по умолчанию и подходит практически для любых рабочих нагрузок, поэтому дополнительные свойства не нужны:

CREATE TABLE IF NOT EXISTS example_tbl_unique
(
user_id LARGEINT NOT NULL,
user_name VARCHAR(50) NOT NULL,
city VARCHAR(20),
age SMALLINT,
sex TINYINT
)
UNIQUE KEY(user_id, user_name)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

Каждая строка идентифицируется значениями (user_id, user_name). При записи строки с уже существующим ключом она перезаписывается; строка с новым ключом вставляется.

Вставка и обновление данных​

Doris выполняет UPSERT по ключу независимо от используемого способа загрузки: строки с существующим ключом обновляются, а строки с новым ключом вставляются. Doris использует ключевые столбцы как для сортировки, так и для дедупликации. В примере ниже используется INSERT; Stream Load, Broker Load и Routine Load работают так же.

Вставка данных в модели Unique Key

В следующем примере исходная таблица содержит 4 строки. Повторная вставка 2 строк с существующими ключами обновляет их на месте:

-- Insert original data
INSERT INTO example_tbl_unique VALUES
(101, 'Tom', 'BJ', 26, 1),
(102, 'Jason', 'BJ', 27, 1),
(103, 'Juice', 'SH', 20, 2),
(104, 'Olivia', 'SZ', 22, 2);

-- Re-insert the same Keys with new values
INSERT INTO example_tbl_unique VALUES
(101, 'Tom', 'BJ', 27, 1),
(102, 'Jason', 'SH', 28, 1);

-- Query the updated data
SELECT * FROM example_tbl_unique;
+---------+-----------+------+------+------+
| user_id | user_name | city | age | sex |
+---------+-----------+------+------+------+
| 101 | Tom | BJ | 27 | 1 |
| 102 | Jason | SH | 28 | 1 |
| 104 | Olivia | SZ | 22 | 2 |
| 103 | Juice | SH | 20 | 2 |
+---------+-----------+------+------+------+

При UPSERT всей строки, если в INSERT INTO перечислены только некоторые столбцы, Doris заполняет остальные значением NULL или значениями по умолчанию.

Обновление отдельных столбцов​

Чтобы изменить несколько полей без перезаписи всей строки, используйте частичное обновление столбцов. Для него требуется merge-on-write (используется по умолчанию), а само частичное обновление включается с помощью параметра. См. раздел Частичное обновление столбцов.

Выбор реализации​

У модели Unique Key есть две реализации хранения данных: merge-on-write (используется по умолчанию и рекомендуется для большинства рабочих нагрузок) и merge-on-read (подходит для конвейеров с интенсивной записью и небольшой нагрузкой на чтение). Реализация выбирается при создании таблицы, и впоследствии её нельзя сменить путём изменения схемы.

Подробнее о принципах работы обеих реализаций, их преимуществах и ограничениях с точки зрения производительности, а также о включении merge-on-read см. в разделе Merge-on-Write.

Примечания​

При использовании модели Unique Key учитывайте следующие ограничения:

  1. Реализацию нельзя сменить: merge-on-write или merge-on-read можно выбрать только при создании таблицы; изменить этот выбор путём изменения схемы нельзя.
  2. При UPSERT всей строки подставляются значения по умолчанию: даже если в INSERT INTO указаны только некоторые столбцы, Doris заполняет неуказанные столбцы значением NULL или значениями по умолчанию.
  3. Для частичного обновления столбцов требуется merge-on-write: чтобы обновлять только отдельные столбцы, используйте merge-on-write и включите частичное обновление столбцов с помощью параметра. См. раздел Частичное обновление столбцов.
  4. Ключи партиционирования должны быть подмножеством ключевых столбцов: это требование Doris гарантирует уникальность данных.