Starrocks 怎么计算各个算子的统计信息

StarRocks:快速查询的秘密解析 StarRocks快速查询的原理。 阅读详情

背景

写这个文章的原因是为了了解一下Starrocks对各个算子的代价是怎么计算的,以便在后续对Starrocks做优化的时候,能够起到辅助作用
本文基于 Starrocks 3.3.5

结论

StatisticsCalculator 通过获取底层数据源的统计信息而进行自上而下的数据信息的统计,这些统计信息的计算大部分也是估算获得的。

分析

直接到 StatisticsCalculator 类中(该类会被DeriveStatsTask调用),这个类采用的典型的Visitor模式,对于不同的算子,会进入到不同的方法中去:
这里我们分析三种算子:

1. Scan olap
2. Filter
3. Projection

其他的算子可以看源码实现。

  1. Scan olap算子
   @Override
    public Void visitLogicalOlapScan(LogicalOlapScanOperator node, ExpressionContext context) {
        return computeOlapScanNode(node, context, node.getTable(), node.getSelectedPartitionId(),
                node.getColRefToColumnMetaMap());
    }

    @Override
    public Void visitPhysicalOlapScan(PhysicalOlapScanOperator node, ExpressionContext context) {
        return computeOlapScanNode(node, context, node.getTable(), node.getSelectedPartitionId(),
                node.getColRefToColumnMetaMap());
    }

    private Void computeOlapScanNode(Operator node, ExpressionContext context, Table table,
                                    Collection<Long> selectedPartitionIds,
                                    Map<ColumnRefOperator, Column> colRefToColumnMetaMap) {
       Preconditions.checkState(context.arity() == 0);
       // 1. get table row count
       long tableRowCount = StatisticsCalcUtils.getTableRowCount(table, node, optimizerContext);
       // 2. get required columns statistics
       Statistics.Builder builder = StatisticsCalcUtils.estimateScanColumns(table, colRefToColumnMetaMap, optimizerContext);
       if (tableRowCount <= 1) {
           builder.setTableRowCountMayInaccurate(true);
       }
       // 3. deal with column statistics for partition prune
       OlapTable olapTable = (OlapTable) table;
       adjustPartitionColsStatistic(selectedPartitionIds, olapTable, builder, colRefToColumnMetaMap);
       builder.setOutputRowCount(tableRowCount);
       if (isRewrittenMvGE(node, table, context)) {
           adjustNestedMvStatistics(context.getGroupExpression().getGroup(), (MaterializedView) olapTable, builder);
           if (node.getProjection() != null) {
               builder.setShadowColumns(node.getProjection().getOutputColumns());
           }
       }
       // 4. estimate cardinality
       context.setStatistics(builder.build());

       return visitOperator(node, context);
   }

这个也是统计信息的来源,其他算子的统计信息都是基于此类算子计算出来的。

  • StatisticsCalcUtils.getTableRowCount 首先计算行数
    该方法会首先获取到扫描的分区数,之后再从CachedStatisticStorage获取到对应分区的行数信息,从而累加,最小为1行
  • StatisticsCalcUtils.estimateScanColumns 获取到对应列的统计信息
    该方法也是从CachedStatisticStorage 获取ColumnStatistics和HistogramStatistics信息
  • 如果行数只有一行,那就标记为统计信息不准确
  • 调增分区列的统计信息
  • visitOperator 这里会对scan涉及到的谓词以及 limit projection 做进一步的统计分析
    对于不同的谓词,利用 BaseCalculatingVisitor / LargeOrCalculatingVisitor 进行统计,比如说 in / or / and等
    对于projection 利用 ExpressionStatisticVisitor类进行统计
  1. Filter算子
    
   @Override
   public Void visitLogicalFilter(LogicalFilterOperator node, ExpressionContext context) {
       return computeFilterNode(node, context);
   }
    @Override
    public Void visitPhysicalFilter(PhysicalFilterOperator node, ExpressionContext context) {
        return computeFilterNode(node, context);
    }
   private Void computeFilterNode(Operator node, ExpressionContext context) {
        Statistics inputStatistics = context.getChildStatistics(0);

        Statistics.Builder builder = Statistics.builder();
        builder.addColumnStatistics(inputStatistics.getColumnStatistics());
        builder.setOutputRowCount(inputStatistics.getOutputRowCount());

        context.setStatistics(builder.build());
        return visitOperator(node, context);
    }
    
  • 对于filter操作来说 ,也是沿用了子节点的统计信息,所以说filter这一层级统计信息和子节点是一致的
  1. Projection算子
@Override
    public Void visitLogicalProject(LogicalProjectOperator node, ExpressionContext context) {
        return computeProjectNode(context, node.getColumnRefMap());
    }

    @Override
    public Void visitPhysicalProject(PhysicalProjectOperator node, ExpressionContext context) {
        return computeProjectNode(context, node.getColumnRefMap());
    }

    private Void computeProjectNode(ExpressionContext context, Map<ColumnRefOperator, ScalarOperator> columnRefMap) {
        Preconditions.checkState(context.arity() == 1);

        Statistics.Builder builder = Statistics.builder();
        Statistics inputStatistics = context.getChildStatistics(0);
        builder.setOutputRowCount(inputStatistics.getOutputRowCount());

        Statistics.Builder allBuilder = Statistics.builder();
        allBuilder.setOutputRowCount(inputStatistics.getOutputRowCount());
        allBuilder.addColumnStatistics(inputStatistics.getColumnStatistics());

        for (ColumnRefOperator requiredColumnRefOperator : columnRefMap.keySet()) {
            ScalarOperator mapOperator = columnRefMap.get(requiredColumnRefOperator);
            if (mapOperator instanceof SubfieldOperator && context.getOptExpression() != null) {
                Operator child = context.getOptExpression().inputAt(0).getOp();
                if (child instanceof LogicalScanOperator || child instanceof PhysicalScanOperator) {
                    addSubFiledStatistics(child, ImmutableMap.of(requiredColumnRefOperator,
                                    (SubfieldOperator) mapOperator), builder);
                    continue;
                }
            }
            ColumnStatistic outputStatistic =
                    ExpressionStatisticCalculator.calculate(mapOperator, allBuilder.build());
            builder.addColumnStatistic(requiredColumnRefOperator, outputStatistic);
            allBuilder.addColumnStatistic(requiredColumnRefOperator, outputStatistic);
        }

        context.setStatistics(builder.build());
        return visitOperator(context.getOp(), context);
    }

对于Projection来说,也是根据不同的 Projection 算子来做区别对待的(也是用ExpressionStatisticVisitor类),如case when操作,函数操作等,这些对应的列的最大值和最小值都是不一样的

StarRocks执行计划深度解读:从EXPLAIN输出发现SQL优化机会 本文深度解读StarRocks执行计划,通过EXPLAIN输出揭示SQL性能优化机会。文章详细解析执行计划结构、节点类型与性能特征,并提供典型性能问题的解决方案,如Join效率低下和聚合操作瓶颈。结合实战案例,展示如何从执行计划中发现优化点,实现查询性能从分钟级到秒级的提升。 阅读详情

相关推荐

从Query Plan到Profile:深入StarRocks查询性能调优实战

本文深入探讨了StarRocks查询性能调优的核心方法,强调通过联动分析Query Plan(执行计划)与Query Profile(执行档案)来精准定位瓶颈。文章详细解读了执行计划的生成与关键指标,介绍了Profile的启用、采集与深度剖析方法,并提供了数据扫描、数据倾斜、连接操作效率低下及内存不足等典型性能瓶颈的实战定位与解决思路,帮助读者构建从监控、诊断到优化的完整闭环。

weixin_29261711的博客 577

Starrocks 对比 Clickhouse

StarRocks 的数据存储、内存中数据的组织方式,以及 SQL 算子的计算方式,都是列式实现的。4)自适应低基数优化:StarRocks 可以自适应地根据数据分布,对低基数的字符串类型的列构建一张全局字典,用 Int 类型做存储和查询,使得内存开销更小,有利于 SIMD 指令执行,加快了查询速度。为了加速查询速度,业内习惯于把多张表打成一张大宽表,大宽表虽速度快,但是带来的问题是极其不灵活,实时数据加工层是用 Flink 将多表 Join 成一张表写入大宽表。

技术改变世界 1533

Doris与StarRocks对比:新一代OLAP引擎

随着数据量爆发式增长,企业对实时数据分析的需求从「事后统计」转向「实时决策」。OLAP(在线分析处理)引擎作为数据仓库体系的核心组件,需要在高并发查询、复杂聚合、实时数据摄入等场景下实现性能突破。Apache Doris(原百度 Palo)与StarRocks(原美团内部系统)作为国产OLAP引擎的双雄,均基于MPP(大规模并行处理)架构,但在技术路线上呈现显著差异。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 733

starrocks查询伪代码

尽可能下推到存储层,在扫描时利用索引 (前缀索引、Bloom Filter、位图索引、ZoneMap) 提前过滤掉大量无关数据块,减少 I/O 和 CPU 处理量。​,实现了极致的查询性能。它将数据处理任务分解成高效的、针对现代硬件优化的批处理操作流,最大限度地榨干了 CPU 和 I/O 的性能。​ 在列数据上执行紧凑的循环,最大化 CPU 缓存利用率。​ 只读查询需要的列,利用列存格式的压缩和编码优势。​ (数据流驱动,最小化等待) 两大核心技术,结合​。​ (所有算子处理 Batch) 和 ​。

dzhou1991的博客 527

浅谈StarRocks SQL性能检查与调优

StarRocks 作为一款高性能的分布式分析型数据库,其 SQL 性能调优需要结合其存储模型、分布式架构和查询优化器特性。以下是性能检查与调优的核心思路及实践方法: 关注点: SCAN 阶段:是否命中分区/分桶裁剪?数据扫描量是否过大? JOIN 阶段:是否触发 Colocate/Bucket Shuffle Join?是否存在数据倾斜? AGGREGATE 阶段:是否过度聚合?是否启用两阶段优化? 2. Profile 分析 查询 Profile:通过 开启,执行查询后获取详细资源消耗

Steven的博客 2162

保姆级教程:用StarRocks Profile和Explain功能排查数据倾斜问题

本文详细介绍了如何使用StarRocks的Profile和Explain功能诊断和优化数据倾斜问题。通过分析执行计划和Query Profile,识别数据分布不均导致的性能瓶颈,并提供六种实战优化策略,包括哈希键优化、Colocate Group应用和动态分区调整等,帮助提升查询效率。

weixin_29258297的博客 196

StarRocks的应用场景

StarRocks的应用场景 StarRocks简介 StarRocks是新一代极速全场景MPP数据库。 StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化、升级架构,并增添了众多全新功能,形成了全新的企业级产品。 StarRocks致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型、更新模型),多种导入方式(批量和实时),支持导入多达10000列的数据,可整合和接入多种现有系统(Spa

齐天大圣数据候的博客 5053

西门子工业物联网云平台 Insights Hub 技术白皮书

Insights Hub是西门子公司推出的工业物联网云平台,它是一个使用开放技术的基于云架构的平台,能够为制造业企业提供物联网连接、数据分析、应用开发等一系列服务。Insights Hub的设计理念是“连接、分析和运营”,即通过连接物理设备、收集数据并进行分析,来优化工业生产的运营和管理。

可爱的刘三岁的博客 3333

StarRocks 的查询性能为什么快?

StarRocks 的性能优势可以概括为五个层次:存储层尽量少读,优化层尽量少走错路,执行层尽量让 CPU 连续并行工作,建模层用物化视图减少重复计算,诊断层用 Plan 和 Profile 把慢路径暴露出来。

weixin_47983718的博客 403

华为/H3C/锐捷交换机配置命令对比表:一张图搞定VLAN划分与端口设置

本文详细对比了华为、H3C、锐捷三大品牌交换机在VLAN划分与端口设置中的配置命令差异,提供从基础配置到高级功能的横向对比表,帮助网络工程师快速掌握多品牌设备混用环境下的配置技巧,提升工作效率。

rust6ferris的博客 699

NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()

Please use torch.nn.Module.to_empty() instead of torch.nn.Module.to()输出(llama) (base) [root@localhost home]# nvidia-smi Unable to determine the device handle for GPU0000:09:00.0: Unknown Error。这是典型的“孤儿进程”,但它还是。(僵尸进程),占用 GPU 资源。如果进程仍然不消失,并且。,这意味着它的父进程是。

m0_61636632的博客 2096

StarRocks 3.3 重磅发布,Lakehouse 架构发展进入快车道!

在 Lakehouse 架构中,缓存设计是实现高效数据处理的关键一环。对于存算分离架构来说,缓存的重要性不言而喻。无论是 Hive、Iceberg、Paimon 等外表,还是 StarRocks 存算分离的内表,缓存命中率的高低直接影响性能的优劣。在缓存命中情况下,性能已经能够追平存算一体的架构,但如何合理、稳定地将热数据保存在缓存中却是一大挑战。StarRocks 原生开发的缓存功能为用户提供了开箱即用的便捷体验。无需复杂的配置,用户即可利用强大的缓存机制提升数据处理性能。

StarRocks的博客 1747

AI Agent Harness Engineering 创业PMF验证工具:用户满意度+留存率+业务指标监测表

在AI Agent创业的浪潮中,我们看到了无数产品如雨后春笋般涌现,但最终能够真正找到PMF并存活下来的却寥寥无几。根据CB Insights的数据,创业公司失败的首要原因(占42%)是"没有市场需求"——换句话说,就是没有找到PMF。AI Agent产品由于其特殊性(交互范式的变革、技术复杂度高、用户期望管理困难等),PMF验证变得更加具有挑战性。传统的SaaS产品PMF验证框架虽然有参考价值,但无法完全适用于AI Agent这种新型产品形态。

AI智能探索者的博客 329

StarRocks系列(01)--StarRocks是什么

本文是本系列第一篇文章,本系列主要目的是介绍StarRocks的特性,使用方法和技巧,内容以官方文档为主,会在官方文档基础上根据实际使用经验做一些扩展,使大家更方便的上手。

曲奇饼的专栏 3297

多测师肖sir_高级金牌讲师_数据库之存储练习题(8.13.1)

实验 一、 实验要求: 理解存储过程的概念 掌握存储过程的语法格式、使用方法 掌握存 储过程的创建、执行 二、实验前提: – drop table if exists student; – Create table student – (Id varchar(255), #学号 – Name varchar(255), #姓名 – Roomid varchar(255), #班级 – Sex char(1), #性别 – Degree varchar(3) );#成绩; Insert into stud

多测师肖sir的博客 702

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1041

一篇文章了解 StarRocks

- StarRocks 是新一代极速全场景 MPP 数据库。 - StarRocks 充分吸收关系型 OLAP 数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化、升级架构,并增添了众多全新功能,形成了全新的企业级产品。 - StarRocks 致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型、更新模型),多种导入方式(批量和实时),支持导入多达10000列的数据,可整合和接入多种现有系统(Spark、Flink、Hive、

Shockang的博客 3054

基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真

本文完成了基于Simulink的PMSM轮毂电机崎岖路面悬架协同控制仿真,实现了:✅ 构建了四轮独立驱动+主动悬架高保真整车模型✅ 实现了Skyhook主动悬架控制✅ 设计了驱动-悬架状态共享与协同决策机制✅ 验证了5 m/s高速下连续颠簸路面稳定通过能力✅ 为高性能移动机器人提供一体化底盘解决方案。

xiaoheshang_123的博客 189

【StarRocks系列】架构、核心概念

通过以上设计,StarRocks在实时数仓、交互式分析、高并发报表等场景表现卓越,适合替代传统Hadoop+MPP混合架构。

技术改变世界 1372

基于 MATLAB 的精馏塔模拟仿真

基于 MATLAB 的精馏塔模拟仿真精馏塔是一种重要的化工设备,其中乙烯精馏塔和醋酸乙烯精馏塔是常见的两种精馏塔。本文基于 MATLAB 软件,给出了针对这两种精馏塔的模拟仿真代码。

与其临渊羡鱼,不如退而结网 903

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从Query Plan到Profile:StarRocks查询性能调优实战指南

本文提供了一份StarRocks查询性能调优的实战指南。通过解析Query Plan(查询计划)预判瓶颈,并结合Query Profile(查询档案)验证实际执行情况,文章详细介绍了从扫描节点指标分析到算子耗时定位的完整流程,并给出了针对预聚合关闭、基数估计不准等常见问题的具体优化方案,帮助用户系统性地提升查询效率。

weixin_29255731的博客 142

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

EMR StarRocks 极速数据湖分析原理解析

作者阿里云 EMR 开源大数据 OLAP 团队StarRocks 社区数据湖分析团队StarRocks 是一个强大的数据分析系统,主要宗旨是为用户提供极速、统一并且易用的数据分析能力,以帮...

weixin_45906054的博客 949

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

StarRocks 如何通过向量化引擎与 CBO 优化器实现极速查询?

本文深入解析了StarRocks如何通过向量化引擎与CBO优化器实现极速查询。向量化引擎利用列式存储与SIMD指令,大幅提升CPU计算效率;CBO优化器则基于成本模型智能选择最优执行计划。两者协同工作,共同应对海量数据下的多表关联与复杂分析场景,助力企业实现亚秒级查询响应。

weixin_28318011的博客 115

不止于极速查询!StarRocks 2025 年度回顾:深耕 Lakehouse,加速 AI 融合

2025 年,是 StarRocks 持续深耕与进化的一年。围绕 Lakehouse 与 AI 实时能力,多个关键能力在迭代与实践中渐次落地。项目的每一步前行,都得益于社区每一次真实的反馈与贡献。 站在岁末年初,我们希望通过这篇文章,与大家共同回顾 2025 的重要时刻,并分享关于 2026 的规划与期待。

StarRocks的博客 1087

国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(上)

没错,国产之强大,越来越多像新时代云原生的Apache Pulsar一样把性能优化极致的正在快速崛起,本篇从StarRocks由来开始,了解其特性和使用场景、架构和原理、组成部分,然后部署了一个FE和3个BE集群,最后通过一个简单建表正式迈入实操

itxiaoshen博客 2275

Starrocks架构特性与OLAP选型

StarRocks 是一款面向实时分析场景的高性能 MPP(大规模并行处理)OLAP 数据库,本文从技术架构、核心特性等维度进行介绍,并横向对比ClickHouse/Doris/Trino等主流引擎,提供OLAP选型指南。

weixin_47983718的博客 423
上一篇: Starrocks的CBO基石--统计信息的来源 StatisticAutoCollector
下一篇: Starrocks 物化视图的实现以及在刷新期间能否读数据
鸿乃江边鸟
博客等级 码龄6年 3746粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值