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
);

        bitmap_hash输出的是64位整数,十亿级数据冲突概率极低。

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

扩展:

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

        2、使用HLL:近似去重,误差在1%~10%。

参考文档:

使用 Bitmap 实现精确去重 | StarRocks

BITMAP | StarRocks

bitmap_hash | StarRocks

bitmap_union_count | StarRocks

使用 HyperLogLog 实现近似去重 | StarRocks

同步物化视图 | StarRocks

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918952.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s单master部署

一、部署 1、初始化 1.1、主机准备 1.2、防火墙与上下文 iptables -t nat -F iptables -t filter -F systemctl disable --now firewalldsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config 1.3、免密登录 ssh-keygenssh-copy-id 192.168.11…

【大模型微调系列-03】 大模型数学基础直观入门

【大模型微调系列-03】 大模型数学基础直观入门&#x1f3af; 本章目标&#xff1a;不要害怕数学&#xff01;我们将通过可视化和简单代码&#xff0c;让你像"看电影"一样理解深度学习的数学原理。记住&#xff0c;深度学习的数学其实就是"让计算机学会调整参数…

科技赋能千年养生丨七彩喜艾灸机器人,让传统智慧触手可及

传统艾灸养生效果显著&#xff0c;却常因烟雾缭绕、操作繁琐、安全隐患等问题令人望而却步。如今&#xff0c;七彩喜艾灸机器人以创新科技破解痛点&#xff0c;将千年艾灸智慧与现代智能深度融合&#xff0c;让养生变得简单、安全、高效&#xff0c;为大众开启“无负担”的艾灸…

【web站点安全开发】任务2:HTML5核心特性与元素详解

目录 一、HTML元素 1、行内元素、块元素、行内块元素 2、替换元素和非替换元素 二、HTML5新增特性 1、语义化标签&#xff1a;提升页面结构化与可读性 2、原生多媒体支持&#xff1a;摆脱插件依赖 3、表单增强&#xff1a;提升交互与验证能力 4、Canvas 与 WebGL&#…

Notepad++插件开发实战:从零打造效率工具

通过定制插件提升文本处理效率300%​​ 一、插件开发核心价值​解决效率瓶颈的终极方案​​定制化工作流​深度集成编辑器功能&#xff08;文档访问、选区操作、语法解析&#xff09;自动化重复操作&#xff08;批量替换、格式转换、数据提取&#xff09;案例&#xff1a;法律文…

微服务单元测试组件(附源码)

背景 微服务的调试&#xff0c;哪怕是简单问题&#xff0c;需要启动9个服务&#xff0c;ui/nginx 网关 应用 auth 基础数据服务 redis nacos 平台服务 &#xff0c;效率差得不行&#xff0c;准备开发一个支持微服务环境的单元测试组件&#xff0c; 组件解决3个问题&#xff1a…

【LeetCode 热题 100】55. 跳跃游戏

Problem: 55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 文…

Java-JVM是什么JVM的类加载机制

一.JVM是什么1.jvm是java虚拟机&#xff0c;是java程序运行的基础环境2.jvm运行的是java源代码经过编译后的class文件&#xff0c;这些class文件经过jvm负责解释或即时编译为对应平台的机器码并执行3.class文件也可以通过其他【jvm languages】经过编译后得到&#xff0c;例如s…

做亚马逊广告,有哪些提高效率的工具

"为什么每天花3小时调整广告却看不到效果&#xff1f;""如何避免高转化关键词被竞争对手抢走&#xff1f;""为什么手动调整预算总是慢市场半拍&#xff1f;""ACOS居高不下真的是关键词选错了吗&#xff1f;""有没有工具能真正实现…

研究学习3DGS的顺序

6 个核心基础模块 序号模块说明推荐学习顺序1&#x1f4f7; 三维计算机视觉基础建立对3D场景、点云、体积的空间理解✅第一个2&#x1f9ee; CT成像原理与图像表示理解CT图像本质、断层数据、密度单位✅并行进行3&#x1f7e1; NeRF与3D Gaussian Splatting原理掌握点云/高斯场…

期刊分类计算机领域会议

该图片已上传图床&#xff0c;需要可自行下载&#xff1a; https://youke1.picui.cn/s1/2025/08/15/689f1e3553930.png 参考链接&#xff1a; 【干货】最全学术期刊级别分类讲解_哔哩哔哩_bilibili

【计算机视觉与深度学习实战】01基于直方图优化的图像去雾技术

摘要 随着计算机视觉技术的快速发展,图像去雾已成为数字图像处理领域的重要研究方向。雾霾、灰尘、水汽等环境因素会严重降低图像的对比度和可见度,影响图像的视觉效果和后续的计算机视觉任务。本文深入探讨了基于直方图优化的图像去雾技术,包括全局直方图均衡化、对比度限…

Vue3 + Axios 实现一个精美天气组件(含实时与未来预报)

Vue3 Axios 实现一个精美天气组件&#xff08;含实时与未来预报&#xff09; 一、前言 在很多管理系统、信息看板、门户首页中&#xff0c;天气模块是一个常见的小组件。 它不仅能展示当前的气温、天气状况&#xff0c;还能提供未来几天的天气趋势&#xff0c;让用户对环境有…

Unity:GUI笔记(二)——工具栏和选择网格、滚动列表和分组、窗口、自定义皮肤样式、自动布局

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的API&#xff1a;GUI.Toolbar()可以创建一个工具栏。有三个参数是必须…

Streamlit实现Qwen对话机器人

Web界面 一、Streamlit 是一个用于创建数据科学和机器学习应用的开源前端框架&#xff0c;能够快速将 Python 脚本转化为交互式 Web 应用。通过简单的 Python API 就能构建出交互式的数据应用。 1、主要特点 简单易用&#xff1a;纯 Python 编写代码&#xff0c;API 简洁直观…

Linux-地址空间

目录 1.介绍 2.理解 3.Linux早期的内核调度队列 1.介绍 这是32位的程序空间地址图&#xff1a; 为了更好地理解这段图&#xff0c;我们来写一段代码编译运行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受

标题&#xff1a;发散创新之力&#xff0c;探索隐私计算的未来 隐私计算&#xff0c;作为当下数字化时代的热门话题&#xff0c;正受到越来越多开发者和从业者的关注。本文将带您走进隐私计算的奇妙世界&#xff0c;探讨其背后的技术原理、应用场景以及发展趋势。 一、隐私计算…

线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉

什么是单例模式&#xff1f;在我们正式讲解单例模式之前&#xff0c;没有了解过的小伙伴可能会有疑问...到底啥叫单例模式&#xff1f;&#xff1f;其实单例模式呢&#xff0c;是我们设计模式中的一种&#xff0c;所谓的设计模式&#xff0c;你可以把它理解为一个模板&#xff…

kubernetes中数据存储etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化数据存储&#xff08;一致性数据库&#xff09;。职责&#xff1a; 保存整个集群的期望状态&#xff08;desired state&#xff09;&#xff0c;包括节点信息、Pod 清单、Service 定义、ConfigMap、Se…

Linux crontab定时任务

参考资料 【図解】cronの仕組み定时任务 - crontab解决ubuntu下定时任务不执行问题crontab环境变量问题&#x1f4a5;Linux定时任务功能详解&#xff1a;crontab与at命令应用指南 目录一. 环境准备1.1 wsl开启systemd1.2 开启cron日志二. cron服务管理相关命令2.1 service 的方…