Модель Unique Key
Модель Unique Key обеспечивает уникальность ключевых столбцов: при вставке или обновлении строки новые данные перезаписывают существующую строку с тем же ключом, поэтому таблица всегда содержит последнюю версию данных. Используйте эту модель, если данные обновляются по первичному ключу.
Когда использовать
Модель Unique Key подходит для трёх основных сценариев:
- Частое обновление данных: синхронизация таблиц измерений в реальном времени из исходных баз данных OLTP, для которой необходимы эффективные операции UPSERT.
- Эффективная дедупликация данных: в системах показа рекламы, управления взаимоотношениями с клиентами (CRM) и подобных системах дубликаты записей удаляются по идентификатору пользователя.
- Частичное обновление столбцов: при назначении профилям динамических тегов, которые часто меняются, или при обработке заказов, когда меняется статус транзакции, можно обновлять только затронутые столбцы.
Создание таблицы 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 работают так же.

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