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()

java 复制代码
TableEnvironment tableEnv = 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. 语法总览(背这一条就够了)

sql 复制代码
ANALYZE TABLE [catalog_name.][db_name.]table_name
  PARTITION(partcol1[=val1] [, partcol2[=val2], ...])
  COMPUTE STATISTICS
  [FOR COLUMNS col1 [, col2, ...] | FOR ALL COLUMNS]

关键规则:

  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 只采集某一个具体分区

sql 复制代码
ANALYZE TABLE Orders
PARTITION(sold_year='2022', sold_month='1', sold_day='10')
COMPUTE STATISTICS;

(Apache Nightlies)

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

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

sql 复制代码
ANALYZE TABLE Orders
PARTITION(sold_year='2022', sold_month='1', sold_day)
COMPUTE STATISTICS;

(Apache Nightlies)

4.3 采集所有分区

sql 复制代码
ANALYZE TABLE Orders
PARTITION(sold_year, sold_month, sold_day)
COMPUTE STATISTICS;

(Apache Nightlies)

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

sql 复制代码
-- 某分区:全列统计
ANALYZE TABLE Orders
PARTITION(sold_year='2022', sold_month='1', sold_day='10')
COMPUTE STATISTICS FOR ALL COLUMNS;

-- 多分区范围:只采 amount、product 两列
ANALYZE TABLE Orders
PARTITION(sold_year='2022', sold_month='1', sold_day)
COMPUTE STATISTICS FOR COLUMNS amount, 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)
相关推荐
武子康1 天前
大数据-237 离线数仓 - Hive 广告业务实战:ODS→DWD 事件解析、广告明细与转化分析落地
大数据·后端·apache hive
大大大大晴天1 天前
Flink生产问题排障-Kryo serializer scala extensions are not available
大数据·flink
武子康3 天前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
武子康4 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库5 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟5 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长5 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计