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
英文地址,請注明出處:http://en.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 的方…