当前位置: 首页 > news >正文

StarRocks优化统计分析

业务需求:统计广告数据,生成流量漏斗,查看广告曝光、点击效果。

StarRocks原表结构:

CREATE TABLE `ad_events` (
`event_time` DATETIME NOT NULL COMMENT '时间',
`event_time_hour` DATETIME NOT NULL COMMENT '时间(分、秒为0)',
`event_type` TINYINT(4) NOT NULL COMMENT '事件类型(1:请求,2:展示,3:点击)',
`user_id` INT(11) NOT NULL COMMENT '用户ID(映射为整数)',
`jh_more` TINYINT(4) NOT NULL COMMENT '是否聚合',
`ad_site_id` VARCHAR(128) NOT NULL COMMENT '代码位id',
`client_type` TINYINT(4) NOT NULL COMMENT '客户端类型',
`my_app_id` VARCHAR(64) NOT NULL COMMENT '应用id',
`ad_type` VARCHAR(32) NOT NULL COMMENT '广告类型',
`platform` TINYINT(4) NOT NULL COMMENT '广告源',
`device_id` VARCHAR(64) NOT NULL COMMENT '设备号'
)
COLLATE='utf8_general_ci'
ENGINE=OLAP
PARTITION BY date_trunc('month', event_time) # 按月分区
DISTRIBUTED BY HASH(`user_id`) BUCKETS 100
PROPERTIES (
"compression" = "LZ4", # 存储算法
"fast_schema_evolution" = "true",
"partition_live_number" = "12", # 保留12个月数据,就是1年的数据
"replicated_storage" = "true",
"replication_num" = "3"  # 3个副本
);

统计分析sql:

SELECT event_type, COUNT(event_type) AS event_type_nums, COUNT(DISTINCT device_id) AS dau_nums 
FROM ssp_ad_events
WHERE user_id = 10077 -- 动态参数AND event_time >= '2025-07-01 00:00:00' -- 动态参数AND event_time <= '2025-07-01 23:59:59' -- 动态参数
GROUP BY event_type;

存在问题:

1、分区字段未有效利用

使用了 event_time精确过滤,但表是按 date_trunc('month', event_time)​​按月分区​​,​​无法利用分区裁剪,会扫描多个分区。

PARTITION BY date_trunc('month', event_time)  -- 按月分区

2、COUNT(DISTINCT)函数

​​COUNT(DISTINCT) 是计算密集型操作,尤其当 device_id 数量很大时,比如上百万个不同设备访问,性能开销非常高。

优化方式:

1、将分区字段改为按天分区

PARTITION BY date_trunc('day', event_time)  -- 按天分区

2、COUNT(DISTINCT device_id) —— 性能瓶颈优化

        当 device_id是字符串类型 VARCHAR(64),并且有大量不同设备访问时,StarRocks 会对所有值进行去重计算​​。
        这是一个​​高CPU、高内存、低效的操作​​,尤其在大规模数据下,可能消耗数秒甚至更长时间。

       使用 Bitmap 类型 + BITMAP_UNION_COUNT 实现高性能去重统计​​。

       优化后的表结构:

CREATE TABLE `ad_events_optimized` (event_time DATETIME NOT NULL COMMENT '事件时间',event_time_hour DATETIME NOT NULL COMMENT '小时粒度时间(分秒归零)',event_type TINYINT NOT NULL COMMENT '事件类型',user_id INT NOT NULL COMMENT '用户ID',jhn_more TINYINT NOT NULL,ad_site_id VARCHAR(128) NOT NULL,client_type TINYINT NOT NULL,my_app_id VARCHAR(64) NOT NULL,ad_type VARCHAR(32) NOT NULL,platform TINYINT NOT NULL,device_id VARCHAR(64) NOT NULL,         -- 使用 BIGINT 存储哈希值(避免冲突)device_id_hash BIGINT,                   -- BITMAP 列(用于聚合去重)device_bitmap BITMAP BITMAP_UNION        
)
PARTITION BY date_trunc('day', event_time)
DISTRIBUTED BY HASH(user_id) BUCKETS 100
PROPERTIES ("replication_num" = "3","compression" = "LZ4"
);

        优化后的sql:

SELECT event_type, COUNT(event_type) AS event_type_nums, bitmap_union_count(device_bitmap) AS dau_nums  -- 优化的地方
FROM ssp_ad_events
WHERE user_id = 10077AND event_time >= '2025-07-01 00:00:00'AND event_time <= '2025-07-01 23:59:59' 
GROUP BY event_type;

        导入数据时生成 Bitmap:

-- INSERT 时直接生成
INSERT INTO ad_events_optimized (event_time, event_time_hour, event_type, user_id, jhn_more, ad_site_id, client_type, my_app_id, ad_type, platform, device_id, device_id_hash, device_bitmap
)
VALUES 
('2025-07-01 10:30:00', '2025-07-01 10:00:00', 1, 10077, 1, 'site_001', 2, 'app_123', 'banner', 1, 'device_abc123',bitmap_hash('device_abc123'),        -- 自动生成哈希to_bitmap(bitmap_hash('device_abc123'))  -- 转为 Bitmap
);

优化后性能提升10倍以上,在十亿级数据量下能接近秒级响应(BE节点的资源要给够)~

扩展:使用物化视图

        物化视图适合固定单参数,由于业务存在动态参数,暂时无法使用

同步物化视图 | StarRocks

告别 Count Distinct 慢查询:StarRocks 高效去重全攻略

http://www.dtcms.com/a/331482.html

相关文章:

  • 好用的开源数据可视化设计工具LIGHT CHASER
  • Java List 集合详解(ArrayList、LinkedList、Vector)
  • pyecharts可视化图表-pie:从入门到精通
  • 适用工业分选和工业应用的高光谱相机有哪些?什么品牌比较好?
  • 这个就是哈希冲突
  • AI出题人给出的Java后端面经(十四)(日更)
  • 智慧养老解决方案:破解“最后一公里”服务难题
  • 【98页PPT】智慧方案某著名企业汽配行业ERP整体解决方案(附下载方式)
  • BGP笔记及实验
  • 网络层协议——IP
  • 2025年机器视觉与信号处理国际会议(MVSP 2025)
  • 72小时到24小时:台风“杨柳”过后,有鹿机器人如何为园区按下“加速键”?
  • SpringBoot 实现在线查看内存对象拓扑图 —— 给 JVM 装上“透视眼”
  • 面试题之项目中灰度发布是怎么做的
  • 16 ABP Framework CLI
  • Steam修改游戏安装目录
  • 通过beeware制作安卓apk用于获取cpolar网址
  • 【从零开始学习Redis】项目实战-黑马点评D1
  • Docker network网络管理入门教程
  • OpenCV 在图像上绘制二维图形的类cv::plot::Plot2d
  • 心灵笔记:沟通与协作
  • 搭建纯积分商城的关键注意事项
  • MySQL中的DML(二)
  • Spring基础面试题(三)
  • rtthread - ROMFS 的使用方式
  • 【自动驾驶】自动驾驶概述 ① ( 自动驾驶 与 无人驾驶 | 自动驾驶 相关岗位 及 技能需求 )
  • 网络安全应急响应
  • Java Stream API:让业务数据处理更优雅
  • 【120页PPT】人工智能与数字化转型的业财融合(附下载方式)
  • TDengine IDMP 基本功能(6. 无问智推)