news 2026/4/16 16:57:54

Flink SQL ANALYZE TABLE手动采集表统计信息,让优化器“更懂数据”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink SQL ANALYZE TABLE手动采集表统计信息,让优化器“更懂数据”

1. ANALYZE 是什么,适合用在什么场景

ANALYZE语句用于为已存在的表采集统计信息(Statistics)并写回 Catalog。目前 Flink 只支持ANALYZE TABLE,而且需要你手动触发,不会自动采集。 (Apache Nightlies)

常见用途(工程视角):

  1. 批处理场景里,为 join / filter / agg 等提供更可靠的行数与列分布信息(让执行计划更“像样”)
  2. 分区表按分区采集统计,避免全表扫描式的统计计算
  3. 数据变更后(重跑/回灌/重分区)重新采集,减少计划误判

注意:当前ANALYZE TABLE只支持 Batch 模式;并且只支持已存在的物理表,如果是 view 或表不存在会抛异常。 (Apache Nightlies)

2. 如何执行 ANALYZE(Java / SQL CLI 都行)

在 Java 里,和 DDL/DML 一样,直接TableEnvironment.executeSql()

TableEnvironmenttableEnv=TableEnvironment.create(...);// 非分区表:只采集表级统计(row count)tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS");// 非分区表:采集表级 + 全列统计tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR ALL COLUMNS");// 非分区表:只采集指定列统计tableEnv.executeSql("ANALYZE TABLE Store COMPUTE STATISTICS FOR COLUMNS location");

分区表可以按分区范围采集(下面第 4 节详细讲)。 (Apache Nightlies)

3. 语法总览(背这一条就够了)

ANALYZETABLE[catalog_name.][db_name.]table_namePARTITION(partcol1[=val1][,partcol2[=val2],...])COMPUTESTATISTICS[FORCOLUMNScol1[,col2,...]|FORALLCOLUMNS]

关键规则:

  1. 分区表必须带PARTITION(...)(否则无法识别为分区采集逻辑)。 (Apache Nightlies)
  2. 不写FOR COLUMNS ... / FOR ALL COLUMNS时:只采集表级统计。 (Apache Nightlies)
  3. 指定了列时:会采集列级统计;列必须存在且必须是物理列,否则抛异常。 (Apache Nightlies)
  4. 非分区表如果写了PARTITION(...):会抛异常。 (Apache Nightlies)
  5. 指定了分区但分区不存在:会抛异常。 (Apache Nightlies)

4. 分区表怎么采集:采一个分区 / 多个分区 / 全部分区

假设分区表Orders的分区列是(sold_year, sold_month, sold_day),并且存在这些分区: (Apache Nightlies)

  • (2022, 1, 10)
  • (2022, 1, 11)
  • (2022, 2, 10)
  • (2022, 2, 11)

4.1 只采集某一个具体分区

ANALYZETABLEOrdersPARTITION(sold_year='2022',sold_month='1',sold_day='10')COMPUTESTATISTICS;

(Apache Nightlies)

4.2 采集“一个范围内的多个分区”(部分分区列给定值,剩余不写值)

下面这种写法表示:sold_year=2022 且 sold_month=1sold_day不限定,因此会覆盖 (2022,1,10) 和 (2022,1,11):

ANALYZETABLEOrdersPARTITION(sold_year='2022',sold_month='1',sold_day)COMPUTESTATISTICS;

(Apache Nightlies)

4.3 采集所有分区

ANALYZETABLEOrdersPARTITION(sold_year,sold_month,sold_day)COMPUTESTATISTICS;

(Apache Nightlies)

4.4 分区表采集列级统计(全列 or 指定列)

-- 某分区:全列统计ANALYZETABLEOrdersPARTITION(sold_year='2022',sold_month='1',sold_day='10')COMPUTESTATISTICSFORALLCOLUMNS;-- 多分区范围:只采 amount、product 两列ANALYZETABLEOrdersPARTITION(sold_year='2022',sold_month='1',sold_day)COMPUTESTATISTICSFORCOLUMNSamount,product;

(Apache Nightlies)

5. 到底采集了哪些列统计(Column Statistics)

当你指定FOR COLUMNS ...FOR ALL COLUMNS时,会采集列级统计项(不同类型支持度不同): (Apache Nightlies)

  1. ndv:distinct 值数量(number of distinct values)
  2. nullCount:NULL 数量
  3. avgLen:平均长度(字符串类常见)
  4. maxLen:最大长度(字符串类常见)
  5. minValue / maxValue:最小/最大值(数值/时间类常见)
  6. valueCount:仅 boolean 类型的 value count

6. 类型支持矩阵(哪些类型能采哪些指标)

Flink 文档给出了“类型 vs 指标”的支持情况(Y 支持 / N 不支持)。这里按“你最常用的类型”总结: (Apache Nightlies)

  1. BOOLEAN:支持nullCountvalueCount;不支持ndv/min/max/len
  2. 数值类(TINYINT/SMALLINT/INT/BIGINT/FLOAT/DOUBLE/DECIMAL):支持ndv/nullCount/min/max
  3. 时间类(DATE/TIME/TIMESTAMP_LTZ/TIMESTAMP):支持ndv/nullCount/min/max
  4. 字符串类(CHAR/VARCHAR):支持ndv/nullCount/avgLen/maxLen(不支持 min/max 值)
  5. 其它复杂类型:多数只支持nullCount,其它通常不支持

另外,定长类型(如 INTEGER/DOUBLE 等)不需要从原始记录采集 avgLen/maxLen。 (Apache Nightlies)

7. 一页结论

  1. ANALYZE TABLE用于采集并存储统计信息到 Catalog,目前需要手动触发。 (Apache Nightlies)
  2. 当前只支持Batch 模式;只支持已存在的物理表,view/不存在会报错。 (Apache Nightlies)
  3. 分区表必须写PARTITION(...),可精确分区、范围分区或全部分区采集。 (Apache Nightlies)
  4. 不指定列时只采表级统计;指定列后才会采列级统计(ndv/nullCount/len/min/max/valueCount 等)。 (Apache Nightlies)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:27:34

Dolby Atmos Lite:轻量级全景声音效模拟工具,多设备音效增强方案

Dolby Atmos Lite是一款专注于音效增强的轻量级工具,旨在通过算法模拟杜比全景声的沉浸式音频体验。该软件以其极小的体积和广泛的设备兼容性,为用户提供了简单的音效优化解决方案,特别适合希望在普通设备上获得更好音频体验的用户。 获取地…

作者头像 李华
网站建设 2026/4/15 16:49:47

python第一阶段第10章

1. 整体介绍1.1 数据来源2. 效果一: 折线图-----2020印美日新冠累计确诊人数2.1 json数据格式2.1.1 什么时json2.1.2 json有什么用2.1.3 json格式数据转化import json # 准备列表 ,列表内每一个元素都是字典,将其转换为json data [{"na…

作者头像 李华
网站建设 2026/4/16 11:04:56

LobeChat能否集成雾凇形成条件?气象奇观预测与摄影时机推荐

LobeChat能否集成雾凇形成条件?气象奇观预测与摄影时机推荐 在吉林市的寒冬清晨,松花江畔的树枝上挂满晶莹剔透的冰晶——这就是被誉为“冬天童话”的雾凇奇观。每年吸引无数摄影师驱车数百公里守候一夜,只为捕捉那一瞬的美景。但问题也随之而…

作者头像 李华
网站建设 2026/4/15 13:16:02

【Embedded Development】嵌入式相关编程技巧

一、简介 此篇文章专用于记录以及汇总嵌入式高级编程技巧。当然这里面就不会去再单独讲解一次合理使用一些关键词(比如const、static、volital)去优化程序代码的情况了。 如有错误欢迎在评论区指出,或者有其他的小技巧,也欢迎在评…

作者头像 李华
网站建设 2026/4/15 17:41:44

8、Linux 用户管理与软件管理全解析

Linux 用户管理与软件管理全解析 1. PAM 认证管理 1.1 PAM 模块概述 PAM(可插拔认证模块)允许系统根据所需的认证类型添加或替换认证模块。管理员只需更改 PAM 配置文件即可实现这一点。PAM 模块位于 /lib/security 目录,更多信息和模块列表可查看 PAM 官网 。 1.2 …

作者头像 李华
网站建设 2026/4/16 10:39:01

16、深入了解Linux存储与设备管理

深入了解Linux存储与设备管理 RAID示例 在一个简单的RAID配置里,有三个RAID设备,利用两块硬盘上对应的分区来设置 /boot 、 /root 和 /home 分区。由于系统只能从RAID 1设备启动,而不能从RAID 5启动,所以 /boot 分区被配置为RAID 1设备,其他分区则采用更常用的R…

作者头像 李华