尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Presto ANALYZE 语句详解:表与列统计信息收集指南

发布时间:2026/9/24 19:19:02

资讯中心
01
ARTICLE

Presto ANALYZE 语句详解:表与列统计信息收集指南

Presto ANALYZE 语句详解:表与列统计信息收集指南
Presto ANALYZE 语句详解表与列统计信息收集指南【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/prestoANALYZE是 Presto 中用于收集表和列统计信息的 SQL 语句这些统计信息行数、空值数、去重值数、min/max 等是查询优化器进行 Join 顺序选择、谓词下推等代价估算的关键输入。本文以 ANALYZE 官方文档 为核心结合 Hive、Iceberg 连接器的实现源码与文档完整讲解语法、WITH 属性、支持范围、实战示例及底层原理帮助读者在 Presto 集群中正确、高效地维护统计信息。语法SynopsisANALYZE table_name [ WITH ( property_name expression [, ...] ) ]table_name目标表名支持catalog.schema.table三段式全限定名也可使用当前 catalog/schema 下的简化名称。WITH子句可选用于传入连接器特定的属性property例如 Hive 连接器的partitions属性。功能描述DescriptionANALYZE用于收集指定表的表级与列级统计信息。需要注意当前实现的限制目前仅为基本类型primitive types收集列统计信息复杂类型如ROW、ARRAY、MAP等不会生成列级统计。统计信息的具体种类由底层连接器决定。以 Hive 连接器为例Hive 连接器文档 中列出的各类型统计项如下列类型收集的统计信息TINYINT/SMALLINT/INTEGER/BIGINT/DOUBLE/REAL/DECIMAL/DATE/TIMESTAMPnull 数量、distinct 数量、min/max 值VARCHAR/CHARnull 数量、distinct 数量VARBINARYnull 数量BOOLEANnull 数量、true/false 值数量列出可用的 WITH 属性WITH子句可用的属性是连接器相关的。要查看当前 Presto 版本下所有连接器注册的 analyze 属性可直接查询系统表SELECT * FROM system.metadata.analyze_properties该表由 AnalyzePropertiesSystemTable.java 实现它继承自AbstractPropertiesSystemTable数据来源是Metadata.getAnalyzePropertyManager().getAllProperties()——也就是把各连接器在启动时注册的 analyze 属性统一汇总后暴露给查询。因此运行这条查询即可获得与当前部署连接器精确匹配的属性清单、类型与默认值。支持的连接器ANALYZE并非所有连接器都支持。根据官方文档当前仅以下两个连接器支持Hive 连接器见 Collecting table and column statistics支持对分区表按分区收集统计信息。Iceberg 连接器见 Collecting table and column statistics支持全表统计信息收集。对其他连接器执行ANALYZE会得到不支持的错误。实战示例Examples1. 分析整张表对当前 catalog/schema 下的表web收集统计信息ANALYZE web;2. 使用三段式表名指定 catalog 与 schema避免歧义ANALYZE hive.default.stores;Iceberg 表用法相同ANALYZE iceberg.default.stores;Iceberg 连接器文档中的示例为ANALYZE iceberg.tpch.orders;即对tpchschema 下的orders表收集统计信息。3. 指定 Hive 分区表的部分分区对于 Hive 分区表默认会分析全部分区也可以使用WITH (partitions ...)精确定位需要分析的分区。partitions属性是一个外层数组其中每个内层数组代表一个分区的各分区键值键值的顺序必须与表 schema 中分区键的声明顺序一致。按单分区键ds为分区键分析两个日期分区ANALYZE hive.default.sales WITH (partitions ARRAY[ARRAY[1992-01-01], ARRAY[1992-01-02]]);按复合分区键分区键为state和city两列分析两组分区ANALYZE hive.default.customers WITH (partitions ARRAY[ARRAY[CA, San Francisco], ARRAY[NY, NY]]);Hive 连接器文档 给出的通用形式为ANALYZE hive.sales WITH ( partitions ARRAY[ ARRAY[partition1_value1, partition1_value2], ARRAY[partition2_value1, partition2_value2]]);以上语句会分别收集分区键为partition1_value1, partition1_value2与partition2_value1, partition2_value2的两个分区的统计信息。4. Iceberg 表的全表分析Iceberg 连接器目前只支持全表统计收集且ANALYZE仅支持在 autocommit 模式下执行参见 Iceberg 连接器文档 中的事务限制说明ANALYZE iceberg.default.stores;源码级原理Hive 连接器的 partitions 属性partitions属性由 HiveAnalyzeProperties.java 定义与解析可以从中看到几个值得注意的实现细节属性名常量public static final String PARTITIONS_PROPERTY partitions;。属性类型声明为array(array(varchar))即内层数组的每个元素都是字符串类型这解释了为何日期分区值需要写成1992-01-01这样的字符串字面量。getPartitionList(...)方法负责从解析后的属性 Map 中取出分区列表未指定时返回Optional.empty()表示分析全表/全部分区。decodePartitionLists(...)会把分区值中的null替换为 Hive 默认分区值HIVE_DEFAULT_DYNAMIC_PARTITION保证动态分区场景下也能正确匹配同时会将结果转换为 Set 去重。若属性中出现null分区值会抛出INVALID_ANALYZE_PROPERTY错误提示 Invalid null value in analyze partitions property。统计收集的执行入口在 HiveMetadata.java 中getStatisticsCollectionMetadata方法定义了ANALYZE执行时收集哪些统计列统计范围排除分区列partitionedBy与隐藏列hidden后的所有列临时表使用getColumnStatisticMetadataForTemporaryTable普通表使用getColumnStatisticMetadata后者会通过 metastore 的getSupportedColumnStatistics确认该类型支持哪些统计项。表统计ANALYZE场景includeRowCount true会额外收集行数ROW_COUNT。结果封装为TableStatisticsMetadata(columnStatistics, tableStatistics, partitionedBy)由引擎统一调度执行统计收集任务最终写回连接器的 metastore。Quick Stats 与 ANALYZE 的互补关系对于尚未执行过ANALYZE的分区Hive 连接器可以通过读取文件/表元数据例如 Parquet footer推断出行数、null 数和 min/max 等快速统计Quick Stats在查询规划阶段作为临时统计来源。其行为由以下属性控制详见 Hive 连接器文档属性名说明默认值hive.quick-stats.enabled是否启用 quick stats 收集也可通过会话属性quick_stats_enabled动态开关falsehive.quick-stats.max-concurrent-callsquick stats 会并发构建此参数控制最大并发调用数见连接器配置使用建议与注意事项分析时机在批量写入、数据导入或 ETL 完成后执行ANALYZE确保优化器基于最新统计信息生成执行计划对于不断变化的分区可针对性地分析近期写入的分区而不是反复全表分析。分区表的成本控制Hive 大分区表上执行不带partitions的ANALYZE会扫描全部分区耗时与资源开销较大应优先使用WITH (partitions ...)精准定位。连接器支持范围目前只有 Hive 与 Iceberg 连接器支持ANALYZE在部署多连接器集群时先通过SELECT * FROM system.metadata.analyze_properties确认目标连接器注册了哪些属性。统计信息驱动优化准确的统计信息直接影响 Join 顺序选择、聚合与扫描阶段的代价估算。若查询计划出现明显退化可先检查相关表是否缺少统计信息例如 Hive 表存在缺失统计信息的分区时可结合 Quick Stats 属性临时补充。类型限制列统计仅覆盖基本类型复杂类型列不会产生列级统计规划阶段对这类列的估算依赖表级信息或连接器默认值。通过以上语法、示例与源码解析读者可以在 Presto 中熟练运用ANALYZE维护表与列统计信息为查询优化器提供准确的代价估算依据从而提升大规模数据查询的执行效率。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。