基于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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;更是技术沉淀与产品信…