在Oracle数据库中,“桶”(Buckets)通常指直方图统计中的数据结构,用于优化查询性能。以下是核心要点:
一、核心作用
-
数据分布分析
将列值按范围划分为多个桶(区间),统计每个桶内数据频率。例如对年龄列分桶:
[0,18),[18,35),[35,60),[60,∞)[0,18), [18,35), [35,60), [60,\infty)[0,18),[18,35),[35,60),[60,∞) -
优化器决策依据
帮助SQL优化器更精准估算:- WHERE子句的选择性(Selectivity)
- JOIN操作的中间结果集大小
- 索引使用效率
二、关键特性
| 特性 | 说明 |
|---|---|
| 桶数量 | 通过SIZE参数指定(默认254),例如:DBMS_STATS.GATHER_TABLE_STATS(METHOD_OPT=>'FOR COLUMNS SIZE 100 salary') |
| 桶类型 | • 等高直方图(Height-Balanced) • 等宽直方图(Frequency) |
| 存储内容 | • 端点值(Endpoint Value) • 累积频率(Endpoint Cumulative Frequency) |
三、工作示例
假设employees表的salary列有直方图(5个桶):
SELECT endpoint_value, endpoint_number
FROM user_tab_histograms
WHERE table_name = 'EMPLOYEES'
AND column_name = 'SALARY';
-- 输出示例:
-- ENDPOINT_VALUE | ENDPOINT_NUMBER
-- 3000 | 15 --> 前15%数据≤3000
-- 6000 | 40 --> 前40%数据≤6000
-- 9000 | 75 --> ...
-- 12000 | 90
-- 15000 | 100
优化器据此可判断WHERE salary > 10000约涉及10%的数据。
四、最佳实践
-
适用场景:
- 数据严重倾斜(如90%值为NULL)
- 范围查询频繁的列
- 多列关联查询
-
维护建议:
-- 自动收集(12c+) ALTER TABLE employees SET STATISTICS AUTO; -- 手动指定桶数 EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'HR', tabname => 'EMPLOYEES', method_opt => 'FOR COLUMNS SIZE 200 salary' );
⚠️ 注意:过度分桶会增加统计信息收集开销,建议通过
DBA_TAB_COL_STATISTICS监控直方图使用效果。
Oracle数据库中桶的作用与实践
3016

被折叠的 条评论
为什么被折叠?



