StarRocks高级特性

本阶段介绍 StarRocks 在运维和复杂场景下的高级功能。

1. Schema Change

  • 文件 : 01_schema_change.sql
  • StarRocks 支持Light Schema Change,加减列、修改列类型等操作非常快,通常不需要重写数据文件。

2. Colocate Join

  • 文件 : 02_colocate_join.sql
  • 解决大表 Join 大表的性能瓶颈。
  • 原理:将 Join Key 相同的表分片(Tablet)放置在同一个 BE 节点上,避免网络 Shuffle。

3. JSON 半结构化分析

  • 文件 : 03_json_analysis.sql
  • StarRocks 使用优化的二进制 JSON 格式存储。
  • 相比将 JSON 存为 String,原生 JSON 类型的解析和查询速度有数量级的提升。
  • 支持 -> 操作符和丰富的 JSON 函数 (get_json_string, json_query 等)。
sql 复制代码
-- Phase 5: 高级特性
-- 01_schema_change.sql
-- 表结构变更 (Schema Change)

USE learn_starrocks;

-- 创建一个初始表
CREATE TABLE IF NOT EXISTS schema_demo (
    id INT,
    v1 INT
)
ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 3
PROPERTIES ("replication_num" = "1");

INSERT INTO schema_demo VALUES (1, 10), (2, 20);

-- 1. 加列 (Add Column)
-- StarRocks 支持 Light Schema Change,加列操作通常是秒级的(只修改元数据)
ALTER TABLE schema_demo ADD COLUMN v2 INT DEFAULT "0" AFTER v1;

-- 2. 修改列类型 (Modify Column)
ALTER TABLE schema_demo MODIFY COLUMN v2 BIGINT;

-- 3. 删除列 (Drop Column)
ALTER TABLE schema_demo DROP COLUMN v1;

-- 4. 建立 rollup (本质上也是一种 Schema Change)
-- ALTER TABLE schema_demo ADD ROLLUP ...

-- 查看 Schema Change 进度
SHOW ALTER TABLE COLUMN;

SELECT * FROM schema_demo;
sql 复制代码
-- Phase 5: 高级特性
-- 02_colocate_join.sql
-- Colocate Join 优化

USE learn_starrocks;

-- 场景:表A 和 表B 经常需要根据 user_id 进行 Join。
-- 如果这两个表的数据分布不一致,Join 时需要进行 Shuffle (网络传输),开销大。
-- Colocate Join 强制让两个表拥有相同的分桶策略和副本分布,使 Join 在本地完成。

-- 1. 创建 Group (可选,也可以隐式创建)
-- 只要两个表的 `DISTRIBUTED BY HASH` 列和桶数一致,且指定相同的 `colocate_with` 组名即可。

-- 表 A
CREATE TABLE IF NOT EXISTS tbl_user (
    user_id INT,
    username VARCHAR(20)
)
ENGINE=OLAP
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 3
PROPERTIES (
    "replication_num" = "1",
    "colocate_with" = "group_user_data" -- 指定组名
);

-- 表 B
CREATE TABLE IF NOT EXISTS tbl_order (
    order_id BIGINT,
    user_id INT, -- Join Key
    amount DECIMAL
)
ENGINE=OLAP
DUPLICATE KEY(order_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 3 -- 必须与 tbl_user 的分桶列和数量一致
PROPERTIES (
    "replication_num" = "1",
    "colocate_with" = "group_user_data" -- 同一个组
);

-- 验证
INSERT INTO tbl_user VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO tbl_order VALUES (101, 1, 99.0), (102, 2, 199.0);

-- 执行 Join
-- EXPLAIN 中应该看不到 `EXCHANGE` 节点(或者 Cost 很低),说明是本地 Join
EXPLAIN SELECT * FROM tbl_user u JOIN tbl_order o ON u.user_id = o.user_id;
sql 复制代码
-- Phase 5: 高级特性
-- 02_colocate_join.sql
-- Colocate Join 优化

USE learn_starrocks;

-- 场景:表A 和 表B 经常需要根据 user_id 进行 Join。
-- 如果这两个表的数据分布不一致,Join 时需要进行 Shuffle (网络传输),开销大。
-- Colocate Join 强制让两个表拥有相同的分桶策略和副本分布,使 Join 在本地完成。

-- 1. 创建 Group (可选,也可以隐式创建)
-- 只要两个表的 `DISTRIBUTED BY HASH` 列和桶数一致,且指定相同的 `colocate_with` 组名即可。

-- 表 A
CREATE TABLE IF NOT EXISTS tbl_user (
    user_id INT,
    username VARCHAR(20)
)
ENGINE=OLAP
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 3
PROPERTIES (
    "replication_num" = "1",
    "colocate_with" = "group_user_data" -- 指定组名
);

-- 表 B
CREATE TABLE IF NOT EXISTS tbl_order (
    order_id BIGINT,
    user_id INT, -- Join Key
    amount DECIMAL
)
ENGINE=OLAP
DUPLICATE KEY(order_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 3 -- 必须与 tbl_user 的分桶列和数量一致
PROPERTIES (
    "replication_num" = "1",
    "colocate_with" = "group_user_data" -- 同一个组
);

-- 验证
INSERT INTO tbl_user VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO tbl_order VALUES (101, 1, 99.0), (102, 2, 199.0);

-- 执行 Join
-- EXPLAIN 中应该看不到 `EXCHANGE` 节点(或者 Cost 很低),说明是本地 Join
EXPLAIN SELECT * FROM tbl_user u JOIN tbl_order o ON u.user_id = o.user_id;
sql 复制代码
-- Phase 5: 高级特性
-- 03_json_analysis.sql
-- 半结构化数据 (JSON) 分析

USE learn_starrocks;

-- StarRocks 提供了原生的 JSON 类型,存储为二进制格式,查询极快。
-- 适用于日志分析、用户画像等 Schema 不固定的场景。

CREATE TABLE IF NOT EXISTS json_logs (
    id BIGINT,
    ts DATETIME,
    payload JSON -- JSON 类型
)
ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 3
PROPERTIES ("replication_num" = "1");

-- 插入 JSON 数据
INSERT INTO json_logs VALUES 
(1, NOW(), parse_json('{"city": "Beijing", "score": 90, "tags": ["A", "B"]}')),
(2, NOW(), parse_json('{"city": "Shanghai", "score": 85, "tags": ["C"]}')),
(3, NOW(), parse_json('{"city": "Beijing", "extra": {"k": "v"}}'));

-- 查询 JSON 字段
-- 1. 使用 -> 访问属性
SELECT 
    id, 
    payload->'city' AS city,
    payload->'score' AS score
FROM json_logs;

-- 2. 过滤
-- 需先转为特定类型再比较,或者直接比较
SELECT * FROM json_logs 
WHERE cast(payload->'score' as INT) > 80;

-- 3. 提取数组
SELECT payload->'tags' FROM json_logs;
相关推荐
ccddsdsdfsdf7 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩8 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空998 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter9 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle
Omics Pro9 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言
JAVA面经实录91710 小时前
Hibernate面试题库
数据库·oracle·hibernate
迷枫71211 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
Mr.Daozhi12 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
小程故事多_8012 小时前
Claude Code自定义workflow skills用法
数据库·人工智能·智能体
大鹏说大话12 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库