大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载本文是 Presto 分布式 SQL 查询引擎中SHOW STATS命令的权威技术指南详细讲解该命令的三种语法形式、返回的八类统计列及其含义并结合仓库源码揭示其底层实现如何从Metadata.getTableStatistics获取统计、如何将字符串区间与数值区间格式化为low_value/high_value以及子查询形式下的语法限制。读完本文你将能够熟练使用SHOW STATS评估表数据分布、检查统计信息完整性并为成本优化器CBO的统计质量做初步诊断。语法SynopsisSHOW STATS命令支持三种形式语法定义位于 SqlBase.g4SHOW STATS FOR table SHOW STATS FOR ( SELECT * FROM table [ WHERE condition ] ) SHOW STATS FOR ( SELECT col1, col2,... colN FROM table [ WHERE condition ] )SHOW STATS FOR table显示指定表的统计信息包括行数、空值数量、最小值与最大值、不同值数量NDV以及表中每一列的平均长度。SHOW STATS FOR ( query )显示某个查询结果集的统计信息。它提供与SHOW STATS FOR table相同的信息但作用于查询的结果集而非单个表。从语法层面看第一条形式对应SHOW STATS FOR qualifiedName表名第二、三条形式对应SHOW STATS FOR ( querySpecification )带括号的子查询子查询在 AST 中表现为TableSubquery。返回的统计信息列SHOW STATS的输出包含一行列的统计行外加一行表的汇总行summary row。汇总行不对应任何具体列因此其column_name值为NULL。数据源上未填充或不可用的任何统计信息都会以NULL返回数据源上收集到的除下表列出的统计之外的其他统计信息不会被包含在SHOW STATS的输出中。ColumnDescriptionNotescolumn_name列的名称在表汇总行中为NULL。data_size列中所有值的总大小字节在表汇总行中为NULL。仅对变宽字符串数据类型的列可用。distinct_values_count列中不同值的估计数量在表汇总行中为NULL。nulls_fractions列中为NULL的值所占比例在表汇总行中为NULL。row_count表中行的估计数量在列统计行中为NULL。low_value此列中发现的最小值在表汇总行中为NULL。仅对 DATE、整数、浮点数和定点精度fixed-precision数据类型可用。high_value此列中发现的最大值在表汇总行中为NULL。仅对 DATE、整数、浮点数和定点精度fixed-precision数据类型可用。histogram此列的直方图以人类可读的格式显示底层直方图的摘要。在表汇总行中为NULL。这八列在实现中的字面定义位于 ShowStatsRewrite.java 的buildColumnsNames()方法中依次为column_name、data_size、distinct_values_count、nulls_fraction、row_count、low_value、high_value、histogram。执行原理从 SHOW STATS 到重写为普通查询SHOW STATS并不是一个独立的执行算子而是在语句分析阶段被重写rewrite为一个普通查询。其入口是 StatementRewrite.java 中注册的ShowStatsRewrite该类实现了StatementRewrite.Rewrite接口。核心流程见 ShowStatsRewrite.java 的visitShowStats与rewriteShowStats区分两种关系类型如果SHOW STATS后面是Table表名形式直接进入重写如果是TableSubquery子查询形式则先对其中的QuerySpecification生成逻辑计划并做合法性校验。获取表句柄与列句柄通过metadata.getColumnHandles获取表的所有列句柄如果子查询中指定了列子集则只保留这些列。调用metadata.getTableStatistics使用表的非隐藏列列表和约束Constraint向元数据层请求TableStatistics。对于SHOW STATS FOR table形式约束恒为Constraint.alwaysTrue()对于带WHERE的子查询形式约束来自逻辑计划中TableScanNode的getCurrentConstraint()这保证了条件可以被下推到数据源。组装结果行buildStatisticsRows遍历表的每一列存在列统计时调用createColumnStatsRow生成该列的统计行否则调用createEmptyColumnStatsRow生成全NULL行最后通过createTableStatsRow追加一条汇总行column_name为NULL仅row_count有值。生成最终查询所有统计行被构造为VALUES行包装成名为table_stats_for_表名的派生表最终输出 8 列结果。值得注意的是统计值均通过createEstimateRepresentationShowStatsRewrite.java转换为DOUBLE字面量当Estimate为未知时输出NULL否则输出其数值。low_value / high_value 的类型化输出low_value与high_value的输出取决于统计类型ShowStatsRewrite.java若ColumnStatistics携带StringRange字符串区间则直接输出区间的最小/最大值适用于 VARCHAR 等变宽字符串类型此时若底层类型不是变宽类型会抛出checkState断言失败。否则使用DoubleRange数值区间并由toStringLiteral按列类型格式化ShowStatsRewrite.javaBIGINT/INTEGER/SMALLINT/TINYINT四舍五入后输出整数文本DOUBLE与DECIMAL直接输出浮点文本REAL转为FLOAT输出DATE按LocalDate.ofEpochDay输出日期字符串TIMESTAMP、TIME、TIMESTAMP_WITH_TIME_ZONE分别转换为对应时间类型输出其他类型抛出IllegalArgumentException。这也解释了文档中low_value/high_value仅对 DATE、整数、浮点数和定点精度数据类型可用的限制——只有这些类型才能被上述逻辑安全地格式化为可读文本。空值比例列名说明文档中该列名为nulls_fractions而在实现buildColumnsNames()中列名为nulls_fraction单数二者指向同一统计ColumnStatistics.getNullsFraction()所表示的列内NULL值占比。查询时以客户端实际收到的列名为准。子查询形式SHOW STATS FOR ( SELECT ... )SHOW STATS FOR ( query )允许对带条件的查询结果集查看统计其合法性与限制由validateShowStatsSubqueryShowStatsRewrite.java严格校验以下子句或特性均不被支持否则抛出NOT_SUPPORTED语义错误FROM中必须恰好有一个表且必须是普通表不能是连接或子查询WHERE中只能包含可被下推的谓词即谓词必须能够下推到表扫描节点计划树中不允许残留FilterNode不支持WITH子句、ORDER BY、LIMIT、HAVING、GROUP BY、DISTINCTSELECT 列表中的列不允许使用别名也不允许出现表达式如函数调用、算术表达式只能是裸列名标识符支持SELECT *形式此时统计所有列。这些限制的根本原因在于SHOW STATS子查询的语义是基于表统计与可下推过滤条件估算结果集的统计而非真正执行查询任何需要真实计算如聚合、排序、去重或无法下推的过滤都无法仅凭存储层统计来回答。典型用法示例查看表整体及所有列的统计SHOW STATS FOR nation;查看带过滤条件的统计谓词可下推SHOW STATS FOR ( SELECT * FROM nation WHERE regionkey 1 );仅查看指定列的统计SHOW STATS FOR ( SELECT nationkey, name FROM nation );仅查看指定列的统计并带过滤条件SHOW STATS FOR ( SELECT col1, col2, col3 FROM table WHERE col1 42 );真实输出示例TPC-H nation 表仓库测试 TestLocalQueries.java 中的testShowColumnStats给出了SHOW STATS FOR nation在 TPC-Hscale factor 1连接器上的真实期望输出列顺序依次为column_name, data_size, distinct_values_count, nulls_fraction, row_count, low_value, high_value, histogramcolumn_name | data_size | distinct_values_count | nulls_fraction | row_count | low_value | high_value | histogram ----------------------------------------------------------------------------------------------------------- nationkey | NULL | 25.0 | 0.0 | NULL | 0 | 24 | NULL name | 177.0 | 25.0 | 0.0 | NULL | NULL | NULL | NULL regionkey | NULL | 5.0 | 0.0 | NULL | 0 | 4 | NULL comment | 1857.0 | 25.0 | 0.0 | NULL | NULL | NULL | NULL NULL | NULL | NULL | NULL | 25.0 | NULL | NULL | NULL该示例直观印证了文档中的关键语义nationkey、regionkey为整数列data_size为NULLdata_size仅对变宽字符串列可用而name、comment为 VARCHAR 列data_size有实际字节数整数列输出low_value/high_value如 0/24、0/4字符串列这两列为NULL字符串区间在此场景未收集/未展示最后一行的汇总行column_name为NULL且只有row_count有值25.0其余列均为NULL。使用场景与注意事项SHOW STATS是数据工程师与查询调优人员诊断统计健康度的常用命令典型场景包括验证 ANALYZE 是否生效执行ANALYZE table后用SHOW STATS FOR table确认各列distinct_values_count、nulls_fraction、low_value、high_value是否已填充从而判断连接器是否上报了可用的统计信息。辅助成本优化器CBO调优Presto 的优化器依赖表统计进行 join 重排、算子代价估算若SHOW STATS输出大量NULL可推断统计缺失可能影响执行计划质量进而决定是否需要运行ANALYZE。快速了解表的数据分布通过low_value/high_value和row_count快速评估表的行数规模与列的取值区间无需执行全表扫描。注意事项所有统计均为估计值测试示例中的 25.0、5.0 等即估计的 NDV 与行数不是精确计数data_size是列内所有值的总字节数仅对变宽字符串列有意义histogram列当前以人类可读文本呈现底层直方图摘要列统计行中无直方图数据时为NULL不同连接器对统计信息的支持程度不同未提供统计的数据源会输出全NULL的列统计行。总结SHOW STATS是 Presto 中查看表级与查询级列统计信息的标准命令。通过本文你可以看到它由 ShowStatsRewrite 在语句分析阶段重写为普通查询核心数据来自Metadata.getTableStatistics输出严格限定为 8 类统计列子查询形式要求单表、可下推谓词且不支持聚合/排序/去重等特性真实输出可在 TestLocalQueries 中查看完整验证。理解这些实现细节有助于你正确解读统计结果并定位统计缺失问题。赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐15分钟吃透 Notepad--免费跨平台文本编辑器批量查找替换与文件对比完整指南15分钟吃透 Notepad 免费跨平台文本编辑器批量查找替换与文件对比完整指南 Notepad 是一款免费的跨平台文本编辑器Windows、Linux、m桌面应用TDengine SHOW 命令全指南集群与系统信息查询速查手册TDengine SHOW 命令全指南集群与系统信息查询速查手册 导读 TDengine 内置了一套完整的 SHOW 语句体系用于快速获取数据库、节点、表、数据库时序数据库物联网大数据实时分析云原生Presto SHOW GRANTS 命令完全指南查询当前用户表级权限授予Presto SHOW GRANTS 命令完全指南查询当前用户表级权限授予 导读 SHOW GRANTS 是 Presto 分布式 SQL 查询引擎中用于查看大数据数据库后端上一篇华硕笔记本性能控制终极指南GHelper轻量级替代方案下一篇大麦抢票自动化:告别手速比拼,3 步搭好双端抢票方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
