基于StarRocks的指標平臺查詢加速方案

項目背景

指標管理平臺按指標查詢類型可以劃為落表指標和即席查詢指標。

  • 落表指標:可選擇不同的維度生成多個結果表(每天提交任務寫入結果表),對指標進行取數的時候會根據查詢條件自動匹配最合適的結果表進行查詢。

  • 即席查詢指標:不產生結果表,每次取數根據指標計算規則以及查詢條件動態生成SQL去指標來源表中查詢。

舉例說明:現有一張訂單明細表 order_info,表結構如下

CREATE TABLE order info`(
order_id`varchar(64)NOT NULL COMMENT"訂單id"pt`varchar(12)NOT NULL COMMENT“用戶id"user id` varchar(64) NOT NULL COMMENT "用戶id",price`double NULL COMMENT ""project_id`int(11)NOT NULL COMMENT"產品id"channel`varchar(64)NULL COMMENT“渠道'ENGINE=OLAP
PRIMARY KEY( order_id,“pt~)
PARTITION BY(`pt~)
DISTRIBUTED BY HASH( order_id)
PROPERTIES(
"replication num""in_memory"= "false"enable persistent index"= "true""replicated storage"= "true"compression"="LZ4"

構建指標

(1)創建模型:示例只有單表不需要增加關聯,選擇price作為度量列,user_id、project_id、channel作為維度列。

(2)創建原子指標:銷售額、計算邏輯 sum(price) , 維度為模型的全部維度。

(3)構建落表派生指標:當日銷售金額、指標計算邏輯 sum(price) , 落表維度分別選擇 channel (渠道當日銷售金額), project_id (產品當日銷售金額)

-- 渠道當日銷售金額create?table?sum_price_day_channel?as?? ??select?sum(price)?as?sum_price_day , channel ,?'{pt}'? ??from?order_info?where?pt?=?'{pt}'? ??group?by?channel;?
-- 產品當日銷售金額create?table?sum_price_day_project?as?? ??select?sum(price)?as?sum_price_day , project_id ,?'{pt}'? ??from?order_info?where?pt?=?'{pt}'? ??group?by?project_id;

(4)構建即席查詢派生指標:當日銷售金額、指標計算邏輯 sum(price), 支持維度選擇 channel、project_id。

查詢指標

(1)根據維度channel ,20250101<= pt <= 20250105 查詢

a.即席查詢:實時生成sql

select?sum(price)?as?sum_price_day,channel,ptfrom?order_info?where?pt >=?'20250101'?and?pt <=?'20250105'group?by?channel,pt

b.落表查詢:當?sum_price_channel 表包含所有需要查詢的日期,否則根據即席查詢生成sql獲取數據。

-- 當sum_price_channel包含所有查詢日期select?sum_price_day,channel,ptfrom?sum_price_day_channel?where?pt?>=?'20250101'?and?pt?<=?'20250105'

(2)根據維度channel、project ,20250101<= pt <= 20250105 查詢

因為落表指標沒有同時包含channel、project_id的結果表則走即席查詢邏輯

select?sum(price)?as?sum_price_day,channel,project_id,ptfrom?order_info?where?pt >=?'20250101'?and?pt <=?'20250105'group?by?channel,project_id,pt

StarRocks物化視圖

圖片

同步物化視圖

限制
  • 只支持單表

  • 本質上是基表的索引而不是物理表

語法
CREATE MATERIALIZED VIEW?[IF NOT EXISTS]?[database.]<mv_name>[COMMENT?""][PROPERTIES ("key"="value", ...)]AS?<query_statement>

異步物化視圖

基于default_catalog為基表創建的異步物化視圖,StarRocks 通過排除數據與基表不一致的物化視圖,來保證改寫之后的查詢與原始查詢結果的強一致性。External Catalog 創建的物化視圖由于異步刷新機制,查詢結果可能與基表上查詢的結果不一致。

限制
  • 異步物化視圖不支持使用 List 分區策略,不支持基于使用 List 分區的基表創建。

  • 查詢改寫只支持Cardinality Preservation Join(結果集行數不會超過輸入表中的任意一方)

  • 不支持grouping set、grouping set with rollup 以及 grouping set with cube 的查詢改寫

  • 分區物化視圖只支持 Range 分區

語法???????
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>[COMMENT?""]-- 必須至少指定?distribution_desc?和?refresh_scheme?其中之一。-- distribution_desc[DISTRIBUTED BY HASH(<bucket_key>[,<bucket_key2> ...]) [BUCKETS <bucket_number>]]-- refresh_desc[REFRESH?-- refresh_moment? ? [IMMEDIATE | DEFERRED]-- refresh_scheme? ? [ASYNC | ASYNC [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]]-- partition_expression[PARTITION BY? ? {<date_column> | date_trunc(fmt, <date_column>)}]-- order_by_expression[ORDER BY (<sort_key>)][PROPERTIES ("key"="value", ...)]AS?<query_statement>

手動刷新視圖???????

-- 異步調用刷新任務。REFRESH MATERIALIZED?VIEW?<mv_name>;-- 同步調用刷新任務。REFRESH MATERIALIZED?VIEW?<mv_name>?WITH?SYNC MODE;

查詢加速

方案一:于StarRocks物化視圖加速即席指標

StarRocks 查詢改會校驗是否可以復用已有物化視圖中的預計算結果處理查詢,如果不能復用會去原表查詢,保證數據一致性。

(1)基于原子指標創建異步物化視圖???????

CREATE?MATERIALIZED?VIEW?sum_price_viewREFRESH ASYNC?START('2025-05-01 09:00:00')?EVERY?(interval?1?day)ASSELECT? ??sum(price),user_id,project_id,channel,ptFROM?order_info?group?by?user_id,project_id,channel,pt;

(2)根據維度channel ,20250101<= pt <= 20250105 查詢

即席查詢生成sql???????

select?sum(price)?as?sum_price_day,channel,pt? ??from?order_info?where?pt >=?'20250101'?and?pt <=?'20250105'group?by?channel,pt

因為有sum_price物化視圖,StarRocks會改寫查詢???????

select?sum(price)?as?sum_price_day,channel,pt? ??from?sum_price_view?where?pt >=?'20250101'?and?pt <=?'20250105'group?by?channel,pt

從而達到查詢加速的目的。

方案二:基于StarRocks物化視圖加速落表指標

落表指標只生成最多維度結果表,其他結果表基于最全結果表使用同步物化視圖代替。

(1)與方案一一樣也基于原子指標創建物化視圖

(2)創建所有已選維度的結果表,結果表使用range分區???????

-- 結果表分區字段設置為date類型,分區方式使用時間表達式分區-- 主鍵修改為bigint類型自增
CREATE?TABLE?IF?NOT?EXISTS?sum_price_day_channel_project_id (? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pk ? ?bigint?AUTO_INCREMENT,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pt ? ? ? ? ? ? ?datetime,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sum_price_day ? ? ??DOUBLE,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?channel ? ? ? ?string,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?project_id ? ? ? ?int(11))? ??PRIMARY?KEY (pk,pt)PARTITION?BY?date_trunc('day',pt)? ? DISTRIBUTED?BY?HASH(pk)PROPERTIES (? ? "enable_persistent_index"?=?"true");
-- 基于所有維度結果表創建異步分區物化視圖CREATE?MATERIALIZED?VIEW?sum_price_day_channel_viewREFRESH ASYNCPARTITION?BY?ptASSELECT? ??sum(sum_price_day),channelFROM?sum_price_day_channel_project_idwhere?pt?=?'{pt}'group?by?channel;
CREATE?MATERIALIZED?VIEW?sum_price_day_project_viewREFRESH ASYNCPARTITION?BY?ptASSELECT? ??sum(sum_price_day),project_idFROM?sum_price_day_channel_project_idwhere?pt?=?'{pt}'group?by?project_id;

(3)落表指標任務 sql 利用物化視圖自動刷新機制,查詢sum_price_day_channel_view、sum_price_day_project_view 數據會與sum_price_day_channel_project_id結果一致,并支持查詢改寫。???????

insert OVERWRITE ?sum_price_day_channel_project_id?PARTITION(pt='20250501') (pt,sum_price_day,channel,project_id)select?str2date('20250501',?'%Y%m%d'),idx.sum_price_day,idx.channel,idx.project_id?from?(?select?sum(price)?as?sum_price_day ,channel, project_id? ??from?order_info?where?pt =?'{pt}'? ??group?by?project_id,channel,project_id;)idx

基于以上操作可以減少導入結果表次數加速任務運行,簡化取數sql結合StarRocks查詢改寫提升查詢性能。

方案三:其他優化

  • 通過字典轉換string類型為integer類型提升效率。

  • 有序的排序聚合 (Sorted streaming aggregate),利用排序鍵提高group性能。

  • Colocate Join 通過指定?"colocate_with" = "group_name" 參數,使相同維度數據保持在同一組 BE 節點上,從而減少數據在節點間的傳輸耗時,提升join性能。

(1)創建字典表并導入數據。???????

CREATE?TABLE?channel_dict (? ? channel STRING,? ? channel_int?BIGINT?AUTO_INCREMENT ?)PRIMARY?KEY (channel)DISTRIBUTED?BY?HASH (channel)PROPERTIES("replicated_storage"?=?"true");
CREATE?TABLE?order_id_dict (? ? order_id STRING,? ? order_id_int?BIGINT?AUTO_INCREMENT?)PRIMARY?KEY (order_id)DISTRIBUTED?BY?HASH (order_id)PROPERTIES("replicated_storage"?=?"true");
CREATE?TABLE?user_id_dict (? ? user_id STRING,? ? user_id_int?BIGINT?AUTO_INCREMENT?)PRIMARY?KEY (user_id)DISTRIBUTED?BY?HASH (user_id)PROPERTIES("replicated_storage"?=?"true");
-- 導入數據insert?into?channel_dict(channel)?select?distinct?channel?from?order_info;insert?into?order_id_dict(order_id)?select?distinct?order_id?from?order_info;insert?into?user_id_dict(user_id)?select?distinct?user_id?from?order_info;

(2)創建包含channel_integer的結果表并導入數據。???????

CREATE?TABLE?order_info_integer (? ?`order_id`?varchar(64)?NOT?NULL?COMMENT "訂單id",? ?`pt`?varchar(12)?NOT?NULL?COMMENT "用戶id",? ?`user_id`?varchar(64)?NOT?NULL?COMMENT "用戶id",? ?`price`?double?NULL?COMMENT "",? ?`project_id`?int(11)?NOT?NULL?COMMENT "產品id",? ?`channel`?varchar(64)?NULL?COMMENT "渠道"? ??-- 該列是配置 dict_mapping 的生成列,在導入數據時其列值自動從示例一中的字典表 dict 中獲取。? ??-- 后續可以直接基于該列進行去重和 JOIN 查詢。? ? channel_int?BIGINT?AS?dict_mapping('channel_dict', channel),? ? order_id_int?BIGINT?AS?dict_mapping('order_id_dict', order_id),? ? user_id?BIGINT?AS?dict_mapping('user_id_dict', user_id)) ENGINE=OLAP?PRIMARY?KEY(`order_id`, `pt`)PARTITION?BY?(`pt`)DISTRIBUTED?BY?HASH(`order_id`)PROPERTIES (? "replication_num"?=?"3",? "in_memory"?=?"false",? "enable_persistent_index"?=?"true",? "replicated_storage"?=?"true",? "compression"?=?"LZ4");
insert?into?order_info_integer (order_id,pt,user_id,price,project_id)select?order_id,pt,user_id,price,project_id?from?order_info;

(3)結果表存儲以及后續關聯都是用integer字段,會加速查詢關聯查詢。

這個方案會產生字典數據,查詢時需要查字典表進行id轉換,會帶來一定開銷,適合關聯比較頻繁的場景使用。

???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86115.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javaweb - 5 事件的綁定

目錄 什么是事件 常見事件 鼠標事件 鍵盤事件 表單事件 事件的綁定方式 通過元素的屬性綁定 通過 DOM 編程動態綁定 總結&#xff1a; 什么是事件 HTML 事件可以是瀏覽器行為&#xff0c;也可以是用戶和行為。當一些行為發生時&#xff0c;可以自動觸發對應的 JS 函數…

怎么讓二級域名綁定到wordpesss指定的頁面

要將二級域名(如 beijing.wodepress.com)綁定到 WordPress 指定頁面(如 wodepress.com/beijing)&#xff0c;可以通過以下步驟實現&#xff1a; 1. 設置泛域名解析 在域名注冊商的管理后臺&#xff0c;添加一條泛域名解析記錄&#xff1a; 主機記錄&#xff1a;輸入 *(星號)…

Ragflow源碼:launch_backend_service.sh

流程圖 #mermaid-svg-hRqGAXWC651HHOLZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRqGAXWC651HHOLZ .error-icon{fill:#552222;}#mermaid-svg-hRqGAXWC651HHOLZ .error-text{fill:#552222;stroke:#552222;}#me…

前端的跨域問題

前端新手也能看懂的跨域問題詳解 在前端開發中&#xff0c;我們經常會聽到“跨域問題”。尤其是在本地調試前端和后臺接口時&#xff0c;瀏覽器突然拋出一堆報錯信息&#xff0c;比如&#xff1a; Access to XMLHttpRequest at [http://api.xxx.com/data](http://api.xxx.com…

TCP 連接在異常情況下的斷開機制

文章目錄 一、進程(客戶端)被 kill 掉1、kill [-15]2、kill -9 二、進程(客戶端) core 掉 一、進程(客戶端)被 kill 掉 詳細驗證流程 1、kill [-15] 2、kill -9 二、進程(客戶端) core 掉

【甲方安全建設】持續滲透測試(一)

持續滲透測試是一種現代安全方法&#xff0c;它對針對組織數字資產的網絡攻擊進行實時或近實時模擬&#xff0c;確保在漏洞出現時識別并解決漏洞… 文章目錄 行業洞察持續滲透測試不是什么&#xff1f;1. 非單一自動化漏洞掃描2. 非傳統人工滲透測試的替代品3. 非萬能解決方案4…

LOCAL PATTERNS GENERALIZE BETTER FOR NOVEL ANOMALIES

標題&#xff1a;局部模式在新穎異常上的泛化能力更強 原文鏈接&#xff1a;https://openreview.net/forum?id4ua4wyAQLm 源碼鏈接&#xff1a;https://github.com/AllenYLJiang/Local-Patterns-Generalize-Better/ 發表&#xff1a;ICLR-2025 摘要 視頻異常檢測&#xff08;…

ABP vNext + Azure Application Insights:APM 監控與性能診斷最佳實踐

ABP vNext Azure Application Insights&#xff1a;APM 監控與性能診斷最佳實踐 &#x1f680; &#x1f4da; 目錄 ABP vNext Azure Application Insights&#xff1a;APM 監控與性能診斷最佳實踐 &#x1f680;1?? 集成目標與環境要求 2?? 安裝 SDK 與注入服務 3?? 日…

OPENGLPG第九版學習 - 紋理與幀緩存 part1

文章目錄 6.1 紋理綜述6.2 基木紋理類型6.3 創建并初始化紋理代理紋理 6.4 指定紋理數據6.4.1 顯式設置紋理數據將靜態數據載入到紋理對象 6.4.2 從緩存(目標對象GL_PIXEL_UNPACK_BUFFER)中加載紋理6.4.3 從文件加載圖像(DDS為例)讀取一個圖像文件并返回內存中的紋素數據將紋素…

誰來定義未來座艙?新一代車載顯示「C位」之戰開啟

在汽車智能網聯化轉型過程中&#xff0c;車載顯示屏幕作為人車交互的重要載體&#xff0c;已經站上了迅猛發展的新起點。 一方面&#xff0c;伴隨著汽車智能化的加速滲透與發展&#xff0c;傳統中控屏與儀表顯示屏的單一顯示模式已經難以匹配智能化交互需求&#xff0c;車載顯…

基于JavaScript的MQTT實時通信應用開發指南

MQTT 協議入門與實踐&#xff1a;使用 JavaScript 構建實時通信應用 1. 什么是 MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一種輕量級的 發布/訂閱&#xff08;Pub-Sub&#xff09; 消息協議&#xff0c;專為低帶寬、高延遲或不穩…

React 19中如何向Vue那樣自定義狀態和方法暴露給父組件。

文章目錄 前言一、什么是 useImperativeHandle&#xff1f;1.1 為什么需要 useImperativeHandle&#xff1f;1.2 基本語法 二、useImperativeHandle 的常見用法3.1 暴露自定義方法3.2子組件封裝的彈窗關閉方法暴露給外部 注意點&#xff1a;總結 前言 在 React 的函數組件中&a…

Windows定時關機工具

自己設計了一款簡單易用的windows定時關機工具&#xff0c;使用簡單&#xff0c;使用只需兩步&#xff1a; 1、輸入設定的時間 2、點擊開始計時 Ps: 1、文章頂部直接下載exe文件 2、文件設置不了免費下載&#xff0c;只能用云盤&#xff1a;定時關機工具.exe - 藍奏云。 w…

楓清科技受邀參加2025數據智能大會

近日&#xff0c;由中國通信標準化協會主辦&#xff0c;中國信通院、大數據技術標準推進委員會(CCSA TC601)承辦的“2025數據智能大會”在北京隆重召開&#xff0c;本屆大會以“Data X AI&#xff0c;數據燃動智能”為主題&#xff0c;聚焦央國企數智化轉型、下一代數據治理、數…

黑馬頭條-數據管理平臺

目錄 項目介紹 功能 項目準備 技術 驗證碼 驗證碼登錄 驗證碼登錄-流程 關于token token的介紹 token的使用 個人信息設置 個人信息設置和axios請求攔截器 axios響應攔截器和身份驗證失敗 優化-axios響應結果 發布文章 發布文章-富文本編輯器 發布文章-頻道列…

Pytorch3D 中涉及的知識點匯總

PyTorch3D 是 Facebook&#xff08;現 Meta&#xff09;AI 研究院&#xff08;FAIR&#xff09;推出的一個基于 PyTorch 的三維計算庫&#xff0c;主要用于 3D 計算機視覺與圖形學任務&#xff0c;如 3D 重建、渲染、點云處理、網格操作等。 下面是對 PyTorch3D 中重要涉及知識…

XML在線格式化工具

XML格式化 免費在線XML格式化與壓縮工具&#xff0c;一鍵美化、校驗、壓縮和優化您的XML代碼。支持自定義縮進、節點折疊&#xff0c;提升可讀性&#xff0c;減小文件體積&#xff0c;加速數據傳輸。 https://toolshu.com/xml 本工具是一款專為處理XML&#xff08;可擴展標記…

【軟件系統架構】系列四:嵌入式技術

目錄 一、嵌入式系統組成 (1)嵌入式處理器 (2)支撐硬件 (3)嵌入式操作系統 (4)支撐軟件 (5)應用軟件 二、嵌入式系統特性 三、嵌入式系統分類與分層結構 1.分類 2.嵌入式軟件的五層架構深入解析 (1)硬件層(Hardware Layer) (2)抽象層(Hardware Ab…

監管報送面試回答思路和示例

在銀行監管報送崗位的面試中&#xff0c;回答問題時需要展現出你的專業知識、實際操作經驗、問題解決能力以及對監管合規的重視。以下是對各類問題的回答思路和示例&#xff1a; 一、專業知識類問題 1. 請簡述銀行監管報送的主要類型和報送頻率 回答思路&#xff1a;分類介紹…

音視頻SDK架構演進的實踐與思考

“不是每一行代碼都值得驕傲&#xff0c;但每一次迭代&#xff0c;都是一次更接近極致的嘗試。” 從最初的數千行代碼、到如今跨平臺、全功能、穩定可靠的直播技術基座&#xff0c;大牛直播SDK走過了整整十年。十年&#xff0c;既是時間的刻度&#xff0c;更是技術沉淀與產品信…