关于 starrocks-expert
StarRocks Expert 是面向 StarRocks OLAP 数据库工作的参考 skill,为数据库从业者提供表结构设计、数据加载、查询优化和集群运维指导。
主要功能
- 01设计表结构与分区
- 02选择数据加载方式
- 03分析并优化查询
- 04规划物化视图
- 05管理和排查集群问题
适用场景
- 01设计 StarRocks 表
- 02构建 S3、HDFS 或 Kafka 数据管道
- 03排查慢查询
- 04处理数据加载故障
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tiansuyu/ agent-skills --skill starrocks-expert安装后在 Claude Code 中输入/starrocks-expert确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/INFRA.mdQUERY.mdTABLE.md详细介绍
StarRocks 专家
StarRocks 是新一代亚秒级 MPP OLAP 数据库,适用于多维分析、实时分析和即席查询等全场景分析。
快速参考
常见操作
检查表结构:
SHOW CREATE TABLE database_name.table_name;
DESC database_name.table_name;
查看分区:
SHOW PARTITIONS FROM database_name.table_name;
检查数据加载状态:
SHOW LOAD WHERE label = 'your_load_label';
SHOW STREAM LOAD;
查询执行分析:
EXPLAIN VERBOSE SELECT ...;
SHOW QUERY PROFILE '<query_id>';
核心概念
表类型:
- Duplicate Key:没有唯一约束,最适合原始数据日志记录
- Aggregate Key:在数据摄取期间预聚合数据
- Unique Key:强制唯一性,支持 upsert
- Primary Key:类似于 Unique Key,但更新性能更佳
数据加载方法:
- Stream Load:基于 HTTP 的实时加载
- Broker Load:从外部存储(S3、HDFS)批量加载
- Routine Load:从 Kafka 持续加载
- INSERT INTO:直接插入 SQL 数据
物化视图:
- 异步 MV:按计划刷新,支持复杂转换
- 同步 Rollup:自动维护聚合数据
何时使用此技能
在以下情况下使用此技能:
- 创建或修改 StarRocks 表架构
- 设置从 S3、HDFS 或 Kafka 加载数据的管道
- 优化慢查询或分析查询计划
- 配置分区和分桶策略
- 排查数据加载失败问题
- 设置物化视图或 Rollup
- 管理集群资源和配置
核心章节
1. 表设计
有关表设计的详细指南,请参阅 TABLE.md:
- 表类型(Duplicate、Aggregate、Unique、Primary Key)
- 使用
date_trunc()表达式的分区策略 - 分桶和分布
- 索引(前缀、布隆过滤器、位图、ngram)
2. 基础设施配置和管理
有关基础设施的详细指南,请参阅 INFRA.md:
- 集群设置和配置(FE/BE/Broker)
- 资源管理和资源组
- 监控和维护
- 备份和恢复
3. 查询和任务技能
有关查询优化的详细指南,请参阅 QUERY.md:
- 数据加载模式(Stream Load、Broker Load、Routine Load)
- 查询优化技术
- 物化视图设计
- ETL 管道模式
- 性能问题排查
- 常见反模式
建表模式
CREATE TABLE IF NOT EXISTS database_name.table_name (
event_time DATETIME NOT NULL COMMENT 'Event timestamp',
id BIGINT NOT NULL COMMENT 'Business ID',
amount DECIMAL(18, 2) COMMENT 'Transaction amount',
status VARCHAR(50) COMMENT 'Status code',
created_at DATETIME COMMENT 'Creation timestamp'
)
DUPLICATE KEY (event_time, id)
PARTITION BY date_trunc('day', event_time) -- Expression-based partitioning
DISTRIBUTED BY HASH(id) BUCKETS 16
PROPERTIES (
"replication_num" = "3",
"storage_medium" = "SSD",
"storage_cooldown_time" = "2024-12-31 23:59:59"
);
有关表类型、分区策略和索引选择的详细指南,请参阅 TABLE.md。
数据加载模式
Stream Load(基于 HTTP)
curl --location-trusted -u user:password \
-H "label:load_label_$(date +%s)" \
-H "column_separator:," \
-H "columns:date_col,id,amount,status,created_at" \
-T data.csv \
http://fe_host:8030/api/database_name/table_name/_stream_load
Broker Load(S3)
LOAD LABEL database_name.load_label_20240101
(
DATA INFILE("s3://bucket/path/data_*.parquet")
INTO TABLE table_name
FORMAT AS "parquet"
)
WITH BROKER
(
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key",
"aws.s3.region" = "us-east-1"
)
PROPERTIES (
"timeout" = "3600"
);
查询优化检查清单
优化查询时:
- 检查分区裁剪是否生效(在 EXPLAIN 中确认)
- 确保存在合适的索引(前缀、布隆过滤器、位图)
- 确认 JOIN 顺序(广播 JOIN 时小表放在右侧)
- 检查是否可以使用物化视图
- 分析数据分布(避免数据倾斜)
- 检查分桶数量(最佳值:每个 BE 核心对应 2–8 个)
- 对频繁执行的 JOIN 考虑使用 colocate 组
分区管理
基于表达式的分区(现代方式,推荐)
根据数据自动创建分区:
-- Partitions auto-created on INSERT
CREATE TABLE events (
event_time DATETIME,
user_id BIGINT
)
DUPLICATE KEY (event_time)
PARTITION BY date_trunc('day', event_time) -- Auto-creates daily partitions
DISTRIBUTED BY HASH(user_id) BUCKETS 16;
-- Hourly granularity for high-frequency data
PARTITION BY date_trunc('hour', event_time)
-- Monthly for long-term storage
PARTITION BY date_trunc('month', event_time)
复合分区(多租户)
CREATE TABLE metrics (
tenant_id INT,
dt DATETIME,
metric_name STRING,
value DOUBLE
)
PRIMARY KEY (tenant_id, dt, metric_name)
PARTITION BY tenant_id, date_trunc('day', dt)
DISTRIBUTED BY HASH(tenant_id) BUCKETS 16;
删除旧分区
-- Show partitions first
SHOW PARTITIONS FROM table_name;
-- Drop specific partition by name
ALTER TABLE table_name DROP PARTITION p20230101_10001;
物化视图模式
CREATE MATERIALIZED VIEW mv_daily_summary
BUILD IMMEDIATE
REFRESH ASYNC START('2024-01-01 00:00:00') EVERY(INTERVAL 1 DAY)
AS
SELECT
date_col,
status,
COUNT(*) as total_count,
SUM(amount) as total_amount,
AVG(amount) as avg_amount
FROM database_name.table_name
GROUP BY date_col, status;
快速故障排查指南
数据加载失败
- 检查错误信息:
SHOW LOAD WHERE label = 'your_label' - 确认数据格式与列定义相符
- 检查 Broker 连通性(用于 Broker Load)
- 确认资源可用性:
SHOW PROC '/backends'
查询速度慢
- 运行
EXPLAIN VERBOSE检查执行计划 - 确认分区裁剪已启用
- 检查分布中的数据倾斜
- 检查 JOIN 策略(广播还是 Shuffle)
- 考虑创建物化视图
Compaction 问题
-- Check compaction status
SHOW PROC '/backends';
SHOW TABLET STATUS FROM table_name;
-- Trigger manual compaction if needed
ALTER TABLE table_name COMPACT;
最佳实践
表设计
- 根据使用场景选择合适的表类型
- 使用
date_trunc()表达式进行基于时间的分区 - 根据集群规模设置 replication_num(通常为 3)
- 分桶数 = BE 核心数 × 2–8
- 将分区总数控制在 100k 以下(注意复合分区)
查询性能
- 尽可能始终按分区键筛选
- 对高基数字符串列使用前缀布隆过滤器
- 避免在生产查询中使用 SELECT *
- 使用合适的 JOIN 类型(尽可能优先使用 INNER JOIN)
数据加载
- 使用 Stream Load 加载实时小批次数据(<10GB)
- 使用 Broker Load 从对象存储加载大型批次数据
- 根据数据量设置合适的超时时间
- 监控加载任务状态并处理失败情况
维护
- 为时序表启用动态分区
- 定期删除旧分区以管理存储
- 监控各 BE 上的 Tablet 分布
- 为加载失败和查询超时设置告警
应避免的常见反模式
❌ 不要对将用于分区的时间列使用 VARCHAR ❌ 不要在 WHERE 中对分区列应用函数(这会导致分区裁剪失效) ❌ 不要创建过多分桶(会产生小文件) ❌ 不要创建过少分桶(会导致数据倾斜) ❌ 不要遗漏分区裁剪谓词 ❌ 如果只需要去重,不要使用 UNIQUE KEY(使用 DUPLICATE + GROUP BY) ❌ 不要在没有标签的情况下加载数据(这会导致无法检测重复数据) ❌ 不要创建总分区数超过 100k 的复合分区
其他资源
关键配置属性
表属性
"replication_num" = "3" # Number of replicas
"storage_medium" = "SSD" # Storage type (SSD/HDD)
"enable_persistent_index" = "true" # For primary key tables
"bloom_filter_columns" = "id,email" # Bloom filter index
"colocate_with" = "group_name" # Colocate tables
会话变量
SET enable_pipeline_engine = true; # Enable vectorized execution
SET pipeline_dop = 0; # Parallelism (0 = auto)
SET query_timeout = 300; # Query timeout in seconds
SET enable_spill = true; # Enable disk spill for large joins
入门工作流
使用新的 StarRocks 项目时:
-
了解使用场景
- OLAP 分析与实时报表
- 查询模式(聚合、连接、筛选)
- 数据量和保留要求
-
设计表结构
- 选择合适的键类型(Duplicate/Aggregate/Unique/Primary)
- 定义分区策略(按日期范围分区)
- 根据数据量计算分桶数
- 阅读 INFRA.md 了解详细指南
-
设置数据管道
- 选择加载方式(Stream/Broker/Routine Load)
- 配置错误处理和重试逻辑
- 阅读 QUERY.md 了解加载模式
-
优化查询
- 分析查询模式
- 为常见聚合创建物化视图
- 调优分区和分桶策略
- 阅读 QUERY.md 了解优化技术
-
监控和维护
- 为加载任务和查询性能设置监控
- 配置自动分区管理
- 规划数据保留和归档
评论
支持 Markdown