oracle 列的直方图

一、4 种直方图类型(核心说明)

【NONE(无直方图)】

适用版本:所有 Oracle 版本

核心逻辑:不统计数据分布,优化器默认按 "均匀分布" 估算行数

适用场景:数据均匀的列(如员工 ID、订单号),无需精准分布统计

关键特点:统计成本最低,无需额外计算资源

【FREQUENCY(频率直方图)】

适用版本:所有 Oracle 版本

核心逻辑:每个唯一值单独建桶(最多 254 个),精准统计每个值的出现次数

适用场景:唯一值少(≤254 个)的列(如性别、学历、部门编码)

关键特点:高频值统计精准,唯一值超 254 个时失效

【HEIGHT BALANCED(高度均衡直方图)】

适用版本:所有 Oracle 版本

核心逻辑:分成最多 254 个桶,每个桶内行数大致相等

适用场景:唯一值多(>254 个)且无明显高频值的列(如普通工资列)

关键特点:覆盖大范围值,无法精准体现单个高频值

【HYBRID(混合直方图)】

适用版本:Oracle 12c 及以上

核心逻辑:高频值单独建桶(按 FREQUENCY),低频值合并建桶(按 HEIGHT BALANCED)

适用场景:唯一值多 + 长尾分布的列(如用户活跃度、商品销量)

关键特点:兼顾精准度和覆盖面,12c + 默认类型

二、类型对比(纯文本清晰版)

类型 适用版本 核心逻辑 适用场景 关键特点NONE(无直方图) 所有版本 不统计分布,默认均匀分布 数据均匀列(ID / 订单号)、无需精准统计 统计成本最低FREQUENCY(频率) 所有版本 每个唯一值 1 个桶(≤254),精准统计次数 唯一值少(≤254)的列(性别 / 部门) 高频值精准,超 254 唯一值失效HEIGHT BALANCED 所有版本 最多 254 桶,每桶行数大致相等 唯一值多(>254)且无明显高频值的列 覆盖广,单个高频值统计模糊HYBRID(混合) 12c+ 高频值单独建桶,低频值合并建桶 唯一值多 + 长尾分布列(销量 / 活跃度) 兼顾精准与覆盖,12c + 默认

三、直方图收集命令(直接复制可用)

自动匹配最优类型(12c + 优先 HYBRID)EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname => ' 你的用户名 ', -- 替换为实际用户名(如 SCOTT)tabname => ' 你的表名 ', -- 替换为实际表名(如 EMP)method_opt => 'FOR ALL COLUMNS SIZE AUTO');

仅对数据倾斜列生成直方图EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname => ' 你的用户名 ',tabname => ' 你的表名 ',method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY');

强制生成 FREQUENCY 直方图(唯一值≤254 时生效)EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname => ' 你的用户名 ',tabname => ' 你的表名 ',method_opt => 'FOR ALL COLUMNS SIZE 254');

禁用直方图(设为 NONE)EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname => ' 你的用户名 ',tabname => ' 你的表名 ',method_opt => 'FOR ALL COLUMNS SIZE 1');

四、查看直方图状态的 SQL

查当前用户表的所有列直方图类型SELECTtable_name, -- 表名column_name, -- 列名histogram -- 结果:NONE/FREQUENCY/HEIGHT BALANCED/HYBRIDFROM USER_TAB_COL_STATISTICSWHERE table_name = ' 你的表名 '; -- 替换为实际表名(大写)

查所有用户表的直方图类型(需 DBA 权限)SELECTowner, -- 用户名table_name, -- 表名column_name, -- 列名histogram -- 直方图类型FROM DBA_TAB_COL_STATISTICSWHERE table_name = ' 你的表名 '; -- 替换为实际表名(大写)

查指定列的直方图分布详情SELECTtable_name,column_name,endpoint_value AS 列值,endpoint_number AS 累计行数FROM USER_HISTOGRAMSWHERE table_name = ' 你的表名 'AND column_name = ' 你的列名 'ORDER BY endpoint_number;

五、实用使用建议

12c + 版本直接用「SIZE AUTO」,Oracle 自动匹配最优类型,无需手动干预

唯一值少 + 高频集中的列(如性别),用「SIZE 254」强制 FREQUENCY,统计更准

唯一值多 + 无高频值的列(如时间戳),保持 NONE 或用 HEIGHT BALANCED,减少开销

收集后通过「USER_HISTOGRAMS」验证分布,避免统计偏差导致 SQL 执行计划低效

相关推荐
devilnumber10 小时前
MySQL 性能优化・诗意化记忆
数据库·mysql·性能优化
瀚高PG实验室10 小时前
PostgreSQL pg_basebackup 和 pg_rewind 可覆盖源端超级用户选择的无关文件HGVE-2026-E010
数据库·postgresql·瀚高数据库
宠友信息12 小时前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
OceanBase数据库官方博客13 小时前
亮相“十五五”公积金高质量发展大会“AI 数据库”助力智慧公积金升级
数据库·人工智能
Lyra_Infra13 小时前
MySQL Docker 误删恢复:binlog PITR
mysql·docker·命令行
龙虾PRO13 小时前
高并发场景数据库调优实操:目标定位、监控方法与优化维度全解析
数据库·oracle
达梦产品与服务13 小时前
SQLark 实战 | 高频 SQL 脚本的导入、管理与复用
数据库·sql·数据库开发·数据库运维·脚本管理·sqlark百灵连接·sql脚本
南城以南溫暖如初14714 小时前
从零搭建24小时自助健身系统:技术选型与核心模块实战
java·spring boot·redis·mysql·vue·mybatis
InfinitePlus14 小时前
redis数据持久化
数据库·redis·缓存
忧郁的橙子.14 小时前
深入浅出etcd与Raft:从核心组件到数据一致性原理
数据库·etcd