Oracle的桶

Oracle数据库中桶的作用与实践

在Oracle数据库中,“桶”(Buckets)通常指直方图统计中的数据结构,用于优化查询性能。以下是核心要点:

一、核心作用

  1. 数据分布分析
    将列值按范围划分为多个桶(区间),统计每个桶内数据频率。例如对年龄列分桶:
    [0,18),[18,35),[35,60),[60,∞)[0,18), [18,35), [35,60), [60,\infty)[0,18),[18,35),[35,60),[60,)

  2. 优化器决策依据
    帮助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%的数据。

四、最佳实践

  1. 适用场景

    • 数据严重倾斜(如90%值为NULL)
    • 范围查询频繁的列
    • 多列关联查询
  2. 维护建议

    -- 自动收集(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监控直方图使用效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值