VARIANT 类型,通过动态子列、稀疏列存储、延迟物化和路径索引等能力,实现了灵活结构 + 列存性能的平衡。本文将对该能力的实现一一讲解,全面展示其优势。
-
牺牲 性能 换取 灵活性(用 JSON 存储,承担高昂查询开销) -
牺牲 灵活性 换取 性能(提前建立 Schema,丧失动态响应业务变化能力)
Doris VARIANT 的卓越性能也在业界公开的 JSONBench 半结构化数据测试中得到了充分验证:冷查询性能排名第一、热查询性能位居第二,全面领先 ClickHouse、Elasticsearch 等一众知名产品。其查询速度约是 MongoDB 的 164 倍、PostgreSQL 的 1074 倍。此外,对 Doris、 Snowflake 进一步对比, 不管是在冷查询还是热查询中,Doris 相较 Snowflake 有约 2-5 倍的性能优势。具体可见下图:

登顶 JSONBench 榜单

Doris vs. Snowflake
-
子列与类型推断: 解析 JSON 的层级结构,提取出所有的 Key Path(如 user.id, event.properties.timestamp),并自动推断每个子列的值类型(如 BIGINT, DOUBLE, STRING 等)。 -
动态列化(Subcolumnization): 对于频繁出现的子列,将其物化为独立的内部子列。例如,嵌套在 JSON 中的 user.id 字段在物理存储上会拥有独立的 BIGINT 列式存储结构。 -
透明访问: 该过程对用户完全透明。无需预先定义 Schema,数据写入时自动完成列式转换。用户仍可使用 v['user']['id'] 查询 ,但查询引擎可以直接访问到已物化的 user.id 子列,充分利用列存和向量化执行的性能优势。 -
稀疏列: 对于出现频率极低或结构复杂的稀疏子列,不为其创建独立子列以避免列爆炸。相反,这些数据会被高效组织在一个类 JSONB 的二进制“稀疏”列中,保留完整数据而不为罕见字段额外建列。
-
压缩: Doris 会根据子列的数据分布自动挑选压缩算法,例如枚举型字段使用字典编码、连续数值用 RLE,从而实现更紧凑的存储并降低读取成本。 -
子列级 I/O (列裁剪):查询只读取实际需要的字段,消除了过去整块 JSON 拉入再解析的方式。通过 Path 级别列裁剪和延迟物化机制,仅加载必需的 JSON 子列数据,有效减少了数据读取的放大问题。
-
优化前:需要解析巨大 Footer(包含所有列的 ColumnMeta),导致大量无效的 I/O 操作、反序列化和内存膨胀,I/O 成为性能瓶颈。 -
优化后:首先读取小型 Footer(仅包含 PagePointer),然后按需加载被访问列的元数据,避免全量解析。打开速度从 65s 缩减至 4s,效率提升约 16 倍;内存从 60GB 缩减至小于 1GB。
-
内存峰值显著降低:每轮只需持有部分列的中间数据,避免了全列并发合并带来的内存瞬时激增; -
I/O 访问更加可控:更细粒度的列组处理,可以更好与磁盘调度、后台刷写并行化配合。
-
原理: VARIANT 允许用户为任意子列创建倒排索引。例如,CREATE INDEX idx ON tbl(v) USING INVERTED PROPERTIES("parser" = "english")。Doris 在数据写入时,自动提取 v 子列的值,并分词(如果需要)或按原始值建立一个从“词(Term)”到“行号(RowID)”的映射表。 -
查询: 当查询条件为 WHERE v['message'] MATCH_ANY 'error' 或 v['level'] = 'FATAL' 时,查询引擎不需扫描全表数据。可直接利用倒排索引,快速定位包含关键词 error 或 FATAL 的所有行,查询复杂度从 O(N) 降至 O(logN) 甚至 O(1)。
-
ZoneMap 索引: 默认开启,记录每个数据块(Page)内子列最大/最小值。对于 WHERE v['properties']['price'] > 1000 这样的范围查询,可快速跳过不满足条件的数据块,甚至跳过文件。 -
BloomFilter 索引: 对于高基数的子列(如 user_id),可创建布隆过滤器索引,快速判断某个值是否存在,过滤掉大量无关读取请求。 -
延迟物化配合索引: 先用 ZoneMap/BloomFilter 倒排在文件/页/行级完成剪枝与定位,再对查询命中的行按需解码非谓词投影的子列,避免对未投影或被过滤掉的子列做无谓解码,可有效降低 CPU 与 I/O 成本。
CREATE TABLEIFNOTEXISTS tbl (
k BIGINT,
v VARIANT<'content' : STRING>,
INDEX idx_tokenized(v) USING INVERTED PROPERTIES(
"parser" = "english",
"field_pattern" = "content",
"support_phrase" = "true"
),
INDEX idx_keyword(v) USING INVERTED PROPERTIES(
"field_pattern" = "content"
)
);
-- tokenized for MATCH; keyword for exact equality
SELECT * FROM tbl WHERE v['content'] MATCH'Doris';
SELECT * FROM tbl WHERE v['content'] = 'Doris';
tokenized 用于
MATCH搜索;keyword 用于精确匹配。
通配符示例:
INDEX idx_logs(v) USING INVERTED PROPERTIES(
"field_pattern" = "logs.*"
);
更多使用方式请参考:https://doris.apache.org/zh-CN/docs/3.x/sql-manual/basic-element/sql-data-types/semi-structured/VARIANT
CREATE TABLE access_log (
dt DATE,
log VARIANT
)
DUPLICATEKEY(dt)
DISTRIBUTEDBYHASH(dt)
PROPERTIES ("replication_num" = "1");
CREATEINDEX idx_log ON access_log(log) USING INVERTED;
curl -u user:password \
-T access.json \
-H "format: json" \
http://fe_host:8030/api/db/access_log/_stream_load
SELECT
log['status'] AS status,COUNT(*) AS cnt
FROM access_log
WHERE log['region'] = 'US'
GROUP BY status;
CREATE TABLE user_profile (
user_id BIGINT,
profile VARIANT
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id);
INSERT INTO user_profile VALUES
(1001, '{"region": "US", "age": 28, "interest": ["movie","sports"]}'),
(1002, '{"region": "CA", "vip": true, "device": "ios"}');
SELECT
CAST(profile['region'] AS String) AS region,COUNT(*) AS cnt
FROM user_profile
WHERE profile['vip'] = true
GROUP BY region;
欢迎加入 Doris社区交流群,还可以免费领取 100+ 企业实践案例集,获取技术帮助、了解最新动态,并与更多开发者和用户互动。

- END -
更多标杆企业信赖
智慧金融与政企:东北证券|国金证券|国信证券|杭银消金|河北幸福消费金融|汇添富基金|金融壹账通|陆金所控股|霖梓控股|拉卡拉|平安人寿 | Planet| 奇富科技|上海证券 | 同程数科|通联支付|无锡锡商银行|星云零售信贷|星火保 | 宇信科技|银联商务|易生支付|招商信诺人寿|招联金融|中信银行信用卡中心|360 数科|360 企业安全浏览器
互联网与文娱:菜鸟|抖音集团|斗鱼|叮咚买菜|浩瀚深度|京东|工商信息查询平台|货拉拉|快手|荔枝微课|票务平台|墨迹天气|MiniMax|奇安信|趣丸科技|顺丰科技|腾讯音乐|天眼查|网易|网易游戏|网易严选|网易云信|网易云音乐|小米|小鹅通|迅雷|约苗|字节跳动|知乎|360 商业化
企业服务与新经济:宝尊科技| 波司登|Cisco|橙联|度言|观测云|慧策|快成物流|领健|领创|灵犀科技|名创优品|Moka BI|美联物业|钱大妈|拈花云科|森马 |思必驰|顺丰科技|上海家化 | 物易云通|云积互动|有赞|雨润集团|纵腾集团|中通快递
先进智造与电信:爱玛|长安汽车|极越汽车|金风科技|科大讯飞|岚图汽车|Lifewit|哪吒科技|四川航空|上海通用五菱|三星电子|蜀海供应链|特步|天翼云|雅迪|中国联通
作为基于 Apache Doris 的商业化公司,飞轮科技秉承着 “开源技术创新”和“实时数仓服务”双轮驱动的战略,在投入资源大力参与 Apache Doris 社区研发和推广的同时,基于 Apache Doris 内核打造了聚焦于企业大数据实时分析需求的企业级产品 SelectDB ,面向新一代需求打造世界领先的实时分析能力。自 2022 年成立以来,获得 IDG 资本、红杉中国、襄禾资本等顶级 VC 的近 10 亿元融资,创下了近年来开源基础软件领域的新纪录。

