mcpField
S
starrocks-expert

starrocks-expert

github.com/tiansuyu数据与数据库439 次安装18 周前更新
代码仓库

关于 starrocks-expert

StarRocks Expert 是面向 StarRocks OLAP 数据库工作的参考 skill,为数据库从业者提供表结构设计、数据加载、查询优化和集群运维指导。

主要功能

  1. 01设计表结构与分区
  2. 02选择数据加载方式
  3. 03分析并优化查询
  4. 04规划物化视图
  5. 05管理和排查集群问题

适用场景

  1. 01设计 StarRocks 表
  2. 02构建 S3、HDFS 或 Kafka 数据管道
  3. 03排查慢查询
  4. 04处理数据加载故障

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tiansuyu/agent-skills --skill starrocks-expert

安装后在 Claude Code 中输入/starrocks-expert确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
INFRA.md
QUERY.md
TABLE.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;

快速故障排查指南

数据加载失败
  1. 检查错误信息:SHOW LOAD WHERE label = 'your_label'
  2. 确认数据格式与列定义相符
  3. 检查 Broker 连通性(用于 Broker Load)
  4. 确认资源可用性:SHOW PROC '/backends'
查询速度慢
  1. 运行 EXPLAIN VERBOSE 检查执行计划
  2. 确认分区裁剪已启用
  3. 检查分布中的数据倾斜
  4. 检查 JOIN 策略(广播还是 Shuffle)
  5. 考虑创建物化视图
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 的复合分区

其他资源

  • 基础设施详情:有关集群设置、表设计模式和资源管理,请参阅 INFRA.md
  • 查询优化:有关高级查询调优、加载模式和 ETL 工作流,请参阅 QUERY.md

关键配置属性

表属性
"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 项目时:

  1. 了解使用场景

    • OLAP 分析与实时报表
    • 查询模式(聚合、连接、筛选)
    • 数据量和保留要求
  2. 设计表结构

    • 选择合适的键类型(Duplicate/Aggregate/Unique/Primary)
    • 定义分区策略(按日期范围分区)
    • 根据数据量计算分桶数
    • 阅读 INFRA.md 了解详细指南
  3. 设置数据管道

    • 选择加载方式(Stream/Broker/Routine Load)
    • 配置错误处理和重试逻辑
    • 阅读 QUERY.md 了解加载模式
  4. 优化查询

    • 分析查询模式
    • 为常见聚合创建物化视图
    • 调优分区和分桶策略
    • 阅读 QUERY.md 了解优化技术
  5. 监控和维护

    • 为加载任务和查询性能设置监控
    • 配置自动分区管理
    • 规划数据保留和归档

评论

支持 Markdown