明细模型
明细模型(Duplicate Key Model)是 Doris 的默认建表模型,用于保存每条原始数据记录,不去重也不聚合。建表时通过 DUPLICATE KEY 关键字指定数据存储的排序列,以优化常用查询;一般建议选择三列或更少的列作为排序键,具体选择方式参考排序键。
适用场景
明细模型中的数据通常只追加,旧数据不会被更新。它适用于需要存储全量原始数据的场景:
- 日志存储:用于存储各类程序操作日志,例如访问日志、错误日志等。每一条数据都需要被详细记录,方便后续审计与分析。
- 用户行为数据:在分析用户行为时(如点击数据、用户访问轨迹等),需要保留用户的详细行为,方便后续构建用户画像,并对行为路径进行细粒度分析。
- 交易数据:在存储交易行为或订单数据时,交易结束后一般不会发生数据变更。明细模型适合保留这一类交易信息,不遗漏任意一笔记录,方便对交易进行精确对账。
核心特性
明细模型具有以下三大特点:
| 特性 | 说明 |
|---|---|
| 保留原始数据 | 保留全量的原始数据,适合保存与查询原始数据。对于需要进行详细数据分析的应用场景,使用明细模型可以避免数据丢失的风险。 |
| 不去重不聚合 | 与聚合模型、主键模型不同,明细模型不会对数据进行去重与聚合。即使两条相同的数据,每次插入时也会被完整保留。 |
| 灵活的数据查询 | 由于保留了全量原始数据,可以从完整数据中提取细节,并基于全量数据做任意维度的聚合操作,从而进行元数据审计与细粒度分析。 |
建表语法
在建表时,通过 DUPLICATE KEY 关键字指定明细模型,并指定数据的 Key 列。Key 列在明细模型中仅用于排序,不强制唯一。
下例创建了一张存储日志信息的明细表,并按 log_time、log_type、error_code 三列进行排序:
CREATE TABLE IF NOT EXISTS example_tbl_duplicate
(
log_time DATETIME NOT NULL,
log_type INT NOT NULL,
error_code INT,
error_msg VARCHAR(1024),
op_id BIGINT,
op_time DATETIME
)
DUPLICATE KEY(log_time, log_type, error_code)
DISTRIBUTED BY HASH(log_type) BUCKETS 10;
数据写入与存储
在明细表中,数据不进行去重与聚合,插入即存储,且 Key 列仅作为排序键使用。

如上图所示,表中原有 4 行数据,再插入 2 行后,全部数据采用追加(APPEND)方式存储,最终保留 6 行:
-- 写入 4 行原始数据
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-02 00:00:00', 1, 2, 'success', 13, '2024-11-02 01:00:00'),
('2024-11-03 00:00:00', 2, 2, 'unknown', 13, '2024-11-03 01:00:00'),
('2024-11-04 00:00:00', 2, 2, 'unknown', 12, '2024-11-04 01:00:00');
-- 再追加写入 2 行数据
INSERT INTO example_tbl_duplicate VALUES
('2024-11-01 00:00:00', 2, 2, 'timeout', 12, '2024-11-01 01:00:00'),
('2024-11-01 00:00:00', 2, 2, 'unknown', 13, '2024-11-01 01:00:00');
-- 查询结果显示全部 6 行均被保留
SELECT * FROM example_tbl_duplicate;
+---------------------+----------+------------+-----------+-------+---------------------+
| log_time | log_type | error_code | error_msg | op_id | op_time |
+---------------------+----------+------------+-----------+-------+---------------------+
| 2024-11-02 00:00:00 | 1 | 2 | success | 13 | 2024-11-02 01:00:00 |
| 2024-11-01 00:00:00 | 2 | 2 | timeout | 12 | 2024-11-01 01:00:00 |
| 2024-11-03 00:00:00 | 2 | 2 | unknown | 13 | 2024-11-03 01:00:00 |
| 2024-11-04 00:00:00 | 2 | 2 | unknown | 12 | 2024-11-04 01:00:00 |
| 2024-11-01 00:00:00 | 2 | 2 | unknown | 13 | 2024-11-01 01:00:00 |
| 2024-11-01 00:00:00 | 2 | 2 | timeout | 12 | 2024-11-01 01:00:00 |
+---------------------+----------+------------+-----------+-------+---------------------+