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

StarRocks 中 CURRENT_TIMESTAMP 和 CURRENT_TIME 分区过滤问题

背景

本文基于Starrocks 3.3.5
最近在进行Starrocks 跑数据的时候,发现了一个SQL 扫描了所有分区的数据,简化后的SQL如下:

select date_created from tableA where date_created=date_format(current_time(), '%Y-%m-%d %H:%i:%S') limit 20

其中建表语句如下:

CREATE TABLE `tableA` (...`date_created` datetime NOT NULL DEFAULT "1970-01-01 00:00:00" COMMENT "",...
) ENGINE=OLAP
PRIMARY KEY(id,date_created)
PARTITION BY date_trunc("day",date_created)
DISTRIBUTED BY HASH(id) BUCKETS 50
PROPERTIES( "compression" = "ZSTD");

但是如果用CURRENT_TIMESTAMP 替换的话,就能实现分区下推,具体的SQL如下:

select date_created from tableA where date_created=CURRENT_TIMESTAMP() limit 20

结论

current_time() 函数不支持常量折叠,也就是不支持在计划解析和优化阶段来计算结果。而CURRENT_TIMESTAMP 在计划优化阶段就可以计算出结果。
具体的explain对应的SQL如下:
在这里插入图片描述
在这里插入图片描述

可以看到 用 current_time 函数的 扫描了全部的分区
CURRENT_TIMESTAMP函数的 只选择了一个分区的数据

分析

先执行两个命令从感官上来感受一下:

TRACE LOGS OPTIMIZER  SELECT CURRENT_TIMESTAMP()\G;
TRACE LOGS OPTIMIZER  SELECT (date_format(current_time(), '%Y-%m-%d %H:%i:%S'))\G;

TRACE LOGS OPTIMIZER SELECT CURRENT_TIMESTAMP()\G;`的结果如下:

...
*************************** 34. row ***************************
Explain String: 0ms|    [MV TRACE] [PREPARE GLOBAL] There are no valid related mvs for the query plan
*************************** 35. row ***************************
Explain String: 0ms|    [MV TRACE] [PREPARE GLOBAL] MV rewrite strategy: MvRewriteStrategy{enableMaterializedViewRewrite=false, enableForceRBORewrite=false, enableViewBasedRewrite=false, enableSingleTableRewrite=false, enableMultiTableRewrite=false, mvStrategy=DEFAULT}
*************************** 36. row ***************************
Explain String: 0ms|    origin logicOperatorTree:
*************************** 37. row ***************************
Explain String: LogicalProjectOperator {projection=[2025-03-28 10:35:00]}
*************************** 38. row ***************************
Explain String: ->  LOGICAL_VALUES
*************************** 39. row ***************************
Explain String: 0ms|    [TRACE QUERY 3efdbff0-0b7d-11f0-8f6c-00163e164034] APPLY RULE TF_PRUNE_PROJECT_COLUMNS 58
*************************** 40. row ***************************
Explain String: Original Expression:
*************************** 41. row ***************************
Explain String: LogicalProjectOperator {projection=[2025-03-28 10:35:00]}
*************************** 42. row ***************************
Explain String: ->  LOGICAL_VALUES
*************************** 43. row ***************************
Explain String: 0ms|
*************************** 44. row ***************************
Explain String: New Expression:
*************************** 45. row ***************************
Explain String: 0:LogicalProjectOperator {projection=[2025-03-28 10:35:00]}
...

TRACE LOGS OPTIMIZER SELECT (date_format(current_time(), '%Y-%m-%d %H:%i:%S'))\G的结果如下:

...
*************************** 34. row ***************************
Explain String: 0ms|    [MV TRACE] [PREPARE GLOBAL] MV rewrite strategy: MvRewriteStrategy{enableMaterializedViewRewrite=false, enableForceRBORewrite=false, enableViewBasedRewrite=false, enableSingleTableRewrite=false, enableMultiTableRewrite=false, mvStrategy=DEFAULT}
*************************** 35. row ***************************
Explain String: 0ms|    origin logicOperatorTree:
*************************** 36. row ***************************
Explain String: LogicalProjectOperator {projection=[date_format(cast(current_time() as datetime), %Y-%m-%d %H:%i:%S)]}
*************************** 37. row ***************************
Explain String: ->  LOGICAL_VALUES
*************************** 38. row ***************************
Explain String: 0ms|    [TRACE QUERY 7af2e9bb-0b7e-11f0-8f6c-00163e164034] APPLY RULE TF_PRUNE_PROJECT_COLUMNS 58
*************************** 39. row ***************************
Explain String: Original Expression:
*************************** 40. row ***************************
Explain String: LogicalProjectOperator {projection=[date_format(cast(current_time() as datetime), %Y-%m-%d %H:%i:%S)]}
*************************** 41. row ***************************
Explain String: ->  LOGICAL_VALUES
*************************** 42. row ***************************
Explain String: 0ms|
*************************** 43. row ***************************
Explain String: New Expression:
*************************** 44. row ***************************
Explain String: 0:LogicalProjectOperator {projection=[date_format(cast(current_time() as datetime), %Y-%m-%d %H:%i:%S)]}
*************************** 45. row ***************************
Explain String: ->  LOGICAL_VALUES
...

可以看到 CURRENT_TIMESTAMP 在优化算子阶段就已经计算出来了,为LogicalProjectOperator {projection=[2025-03-28 10:35:00]}
(date_format(current_time(), '%Y-%m-%d %H:%i:%S')) 并没有计算出来,为LogicalProjectOperator {projection=[date_format(cast(current_time() as datetime), %Y-%m-%d %H:%i:%S)]}

在这个案例中,主要涉及到的规则主要是:

FoldConstantsRule
PartitionPruneRule

我们分析一下简单的SQL语句的数据流:SELECT CURRENT_TIMESTAMP()

g4文件中querySpecification||\/
ConnectProcessor.handleQuery||\/
com.starrocks.sql.parser.SqlParser.parse||\/
// 同时.g4 文件中 specialDateTimeExpression
// AstBuilder.visitSpecialDateTimeExpression 会构造 new FunctionCallExpr
// 这里最终会构建 SelectRelation(SelectList(FunctionCallExpr),ValuesRelation.newDualRelation)
AstBuilder.visitQuerySpecification ||\/
StatementPlanner.plan||\/
createQueryPlan||\/
new RelationTransformer(transformerContext).transformWithSelectLimit(query) ||\/
transform||\/
visit(relation);||\/
RelationTransformer.visitSelect||\/
QueryTransformer.plan||\/
SqlToScalarOperatorTranslator.translate => Visitor.visit => visitFunctionCall // 此时的逻辑计划为 SelectRelation(SelectList(CallOperator(CURRENT_TIMESTAMP)),ValuesRelation.newDualRelation)||\/=> scalarRewriter.rewrite(result, ScalarOperatorRewriter.DEFAULT_REWRITE_RULES) // 这里有ImplicitCastRule和FoldConstantsRule||\/
projectForOrder  // 此时的的逻辑计划为 LogicalPlan(OptExprBuilder(LogicalProjectOperator(CallOperator(CURRENT_TIMESTAMP)))

现在来重点关注 DEFAULT_REWRITE_RULES 中涉及到的 ImplicitCastRule FoldConstantsRule 规则:
首先是 ImplicitCastRule 规则(这里主要是visitCall方法):

这个规则主做:
1. 如果表达式需要的类型和该表达式对应的子表达式的参数输出的类型如果不一致的话,则会给表达式的子表达式加上一个CastOperator操作
2. 对每一个子表达式都递归一遍1步骤

date_format(current_time(), '%Y-%m-%d %H:%i:%S')就会命中这个规则
再次 是 FoldConstantsRule 规则(这里主要是visitCall/visitCastOperator方法):

这个主要是做:
1. 主要是计算表达式为常量,即把CallOperator变成 ConstantOperator
2. 根据ScalarOperatorFunctions 和 MetaFunctions 函数中标注为 ConstantFunction 的函数,来看是否能够计算为常量
在这里能够找到  CURRENT_TIMESTAMP() 函数,但是找不到 current_time() 函数

CURRENT_TIMESTAMP() 就会命中这个规则

以上的 都在 “Transformer” 阶段完成的。
至于 PartitionPruneRule 则会在“Optimizer” 阶段完成 ,也就是optimizer.optimize方法中, 具体的实现,可以细看 PartitionPruneRule对应的方法,也就是在这个规则里会对涉及到的谓词来过滤出对应的分区,很显然因为CURRENT_TIMESTAMP是常量,所以能够裁剪到对应的分区中去,而date_format(current_time(), '%Y-%m-%d %H:%i:%S')不能计算出来,所以扫描了全表。

其他

trace输出信息的怎么回事

首先在g4文件中

queryStatement: (explainDesc | optimizerTrace) ? queryRelation outfile?;

有对应的optimze语句 也就是 TRACE LOGS
这个在解析的时候 AstBuilder.visitQueryStatement 中会调用 queryStatement.setIsTrace 方法:

public void setIsTrace(Tracers.Mode mode, String module) {this.isExplain = true;this.traceMode = mode;this.traceModule = module;}

此时 isExplain 设置为了true
之后在 StmtExecutor.execute方法中:

 } else if (parsedStmt.isExplain()) {String explainString = buildExplainString(execPlan, ResourceGroupClassifier.QueryType.SELECT,parsedStmt.getExplainLevel());if (executeInFe) {explainString = "EXECUTE IN FE\n" + explainString;}

这里的方法buildExplainString就会组装对应的explain信息:

 if (parsedStmt.getTraceMode() == Tracers.Mode.TIMER) {explainString += Tracers.printScopeTimer();} else if (parsedStmt.getTraceMode() == Tracers.Mode.VARS) {explainString += Tracers.printVars();} else if (parsedStmt.getTraceMode() == Tracers.Mode.TIMING) {explainString += Tracers.printTiming();} else if (parsedStmt.getTraceMode() == Tracers.Mode.LOGS) {explainString += Tracers.printLogs();} else if (parsedStmt.getTraceMode() == Tracers.Mode.REASON) {explainString += Tracers.printReasons();} else {explainString += execPlan.getExplainString(explainLevel);}

所以在执行trace LOGS命令的时候会输出对应信息

相关文章:

StarRocks 中 CURRENT_TIMESTAMP 和 CURRENT_TIME 分区过滤问题

背景 本文基于Starrocks 3.3.5 最近在进行Starrocks 跑数据的时候,发现了一个SQL 扫描了所有分区的数据,简化后的SQL如下: select date_created from tableA where date_createddate_format(current_time(), %Y-%m-%d %H:%i:%S) limit 20其…...

OMI(operating mode indication)

OMI(operating mode indication,操作模式指示)是11ax引入的用以交互形式分配兼容性以及信道带宽的协商。可以降终端活跃时间的耗电量. 802.11ax终端使用802.11数据使用OM控制字段(OM Control Subfield,其通常位于数据或者管理帧中),其用来指示改变AP的发送或者接收模式。8…...

4、网工软考—VLAN配置—hybird配置

1、实验环境搭建: 2、实验过程 SW1: 先创建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的标签 …...

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…...

第 8 章:使用更好的库_《C++性能优化指南》_notes

使用更好的库 第八章核心知识点解析编译与测试建议总结优化原则重点内容:第一部分:多选题(10题)第二部分:设计题答案与解析多选题答案:设计题答案示例(部分): 测试用例设…...

基于深度学习的图像超分辨率技术研究与实现

一、引言 在数字图像处理领域,图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高,如何将低分辨率图像提升到高分辨率,同时保持图像的细节和清晰度,成为了一个极具挑战性的问题。传统的图像超分辨率…...

ubuntu22.04 ROS2humble 路径文件

ROS2humble 路径文件 /opt/ros/humble/include/opt/ros/humble/lib/opt/ros/humble/share 下载ros2之后会有下面的文件,在/opt/ros/humble下 /opt/ros/humble/include C/C 头文件(.h, .hpp) /opt/ros/humble/lib 作用: 存放 编译生成的二…...

OpenCV 图形API(或称G-API)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 引言 OpenCV 图形API(或称G-API)是一个新的OpenCV模块,旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…...

数据设计(范式、步骤)

文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式,指导如何设计一个关系型数据库。 1NF: 关系表的每个字段,都应该是不可再分的,——保证原子性。 字…...

Linux命令大全:从入门到高效运维

适合人群:Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令(每天必用) 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令(按需使用) 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…...

系统与网络安全------网络应用基础(3)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 路由器 路由器认识路由器工作原理基本配置直连路由远程管理路由器远程连接测试 路由器 认识路由器 负责在不同网络之间转发数据的设备 路由器决定到达目标的路径 路由器也为直连网络的主机充当”网关“角色…...

常用的测试用例

登录、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求&#xf…...

标准库中有uint32_t类型吗?

标准 C 库中有uint32_t类型。它定义在<stdint.h>头文件中&#xff0c;表示无符号 32 位整数类型。 #include <stdio.h> #include <stdint.h>int main() {uint32_t num 4294967295; // 32位无符号整数的最大值printf("The value of num is %u\n"…...

作业(7)

接口ip配置和区域划分&#xff1a; fw1&#xff1a; [fw1]interface GigabitEthernet 0/0/0 [fw1-GigabitEthernet0/0/0]service-manage all permit [fw1]firewall zone trust [fw1-zone-trust]add interface GigabitEthernet 1/0/0 [fw1]security-policy [fw1-policy-secu…...

kafka 报错消息太大解决方案 Broker: Message size too large

kafka-configs.sh --bootstrap-server localhost:9092 \ --alter --entity-type topics \ --entity-name sim_result_zy \ --add-config max.message.bytes10485880 学习营课程...

Burp Suite抓包实战:SQL注入漏洞挖掘

本文系统解析如何利用Burp Suite专业版开展SQL注入漏洞的定向挖掘&#xff0c;涵盖手动探测、自动化利用、WAF绕过等进阶技巧。通过电商、金融等行业的真实渗透案例&#xff0c;详解从流量拦截到漏洞利用的全链路方法论&#xff0c;实现单日最高挖掘23个高危注入点的实战成果。…...

open-cv的安装

python -m pip install numpy matplotlib opencv-python 【记得科学上网&#xff0c;不然太慢了】...

docker-compose自定义网络,解决docker-compose网段路由冲突

问题排查 先route一波查看一下路由表 容器路由19和堡垒机路由冲突 解决方案 更改docker网段更改docker生成容器的网段 > 基本操作 docker network ls &#xff1a;查看docker网络列表 docker network inspect <network id/name>&#xff1a;查看某个docker网络详情…...

数据库三级选择题(2)

C) 分布式数据库的事务管理包括恢复控制和并发控制&#xff0c;恢复控制一般采用的策略是基于两阶段提交协议 采用一定的计算方法定位数据的有 Ⅳ&#xff0e;散列&#xff08;哈希&#xff09;索引 下列提供逻辑独立性的是外模式/模式映像 UML所有活动有关判断的部分要用菱形表…...

【入门初级篇】报表基础操作与功能介绍

【入门初级篇】报表的基本操作与功能介绍 视频要点 &#xff08;1&#xff09;报表组件的创建 &#xff08;2&#xff09;指标组件的使用&#xff1a;一级、二级指标操作演示 &#xff08;3&#xff09;表格属性设置介绍 &#xff08;4&#xff09;图表属性设置介绍 &#xff0…...

GenBI 中如何引入 LLM 做意图路由,区分查数据还是闲聊

写在前面 生成式商业智能(Generative BI, GenBI)的魅力在于其能够理解用户的自然语言,并将复杂的数据查询和分析过程自动化。用户不再需要学习 SQL 或操作复杂的界面,只需像与同事交谈一样提出问题,就能获得数据洞察。然而,一个现实的挑战是:用户的输入并非总是明确的数…...

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…...

【多媒体交互】Unity Kinect实现UI控件的点击

在Unity中&#xff0c;通过Kinect实现UI控件的点击功能&#xff0c;主要涉及手部追踪、坐标映射和手势检测三个核心环节。 实现步骤 初始化Kinect与关节追踪 使用KinectManager获取用户ID和手部关节点&#xff08;如JointType.HandLeft&#xff09;的坐标。 long userId _…...

vue将页面导出成word

方法一&#xff1a;使用 html-docx-js html-docx-js 是一个轻量级的库&#xff0c;可以将 HTML 转换为 Word 文档。 安装依赖 首先安装 html-docx-js&#xff1a; Bash深色版本 npm install html-docx-js --save创建导出逻辑 在 Vue 组件中实现导出功能的代码如下&#xff1…...

React 知识回顾(HOC、合成事件、Fiber)

HOC 嗯&#xff0c;用户问的是HOC是什么以及它能用来做什么。我需要先理解HOC的基本概念&#xff0c;然后整理它的用途。根据搜索结果&#xff0c;HOC是React中的高阶组件&#xff0c;用来复用逻辑。网页1提到HOC是一个函数&#xff0c;接收组件返回新组件&#xff0c;属于设计…...

hive相关面试题以及答案

什么是Hive&#xff1f;它的作用是什么&#xff1f; 答&#xff1a;Hive是一个建立在Hadoop之上的数据仓库工具&#xff0c;它提供了类似于SQL的查询语言HiveQL来操作存储在Hadoop中的数据。Hive的主要作用是让用户能够使用SQL语法来查询和分析大规模数据集。 Hive的架构是什么…...

Jmeter-负载测试

目录 一. 基础负载测试场景&#xff1a;固定并发用户数 1、线程组配置 2、HTTP请求配置 3、添加定时器 4、添加监听器 4.1 聚合报告 4.2 响应时间图 4.3 查看结果树 5、结果分析指标 二. 阶梯式加压场景&#xff08;逐步增加并发&#xff09; 1、插件安装 2、阶梯配…...

《深度剖析SQL数据类型转换:隐式与显式的奥秘》

在SQL的世界里&#xff0c;数据类型转换是一个基础且关键的操作&#xff0c;它贯穿于数据库开发、管理与数据分析的各个环节。数据类型转换分为隐式转换和显式转换&#xff0c;二者各有特点与应用场景&#xff0c;深刻理解它们对于编写高效、稳定的SQL代码至关重要。 一、数据…...

基于大模型的自发性气胸全方位预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测自发性气胸的原理及技术基础 2.1 大模型介绍 2.2 模型构建与训练数据 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 基于预测的术前准备 3.3 手术方案与麻醉方案制定…...

经销商订货管理系统小程序PHP+uniapp

订货管理系统的行业变革势能 在实体商业与电商融合加速的2025年&#xff0c;订货管理系统已成为连锁品牌、商贸批发企业及工厂客户的核心数字化基建。面对经销商订货流程冗长、加盟商库存协同低效、批发贸易数据孤岛等行业痛点&#xff0c;新一代系统通过ThinkPHPUniapp技术架…...