ITPub博客

首页 > 数据库 > Oracle > Oracle Join Cardinality计算公式

Oracle Join Cardinality计算公式

原创 Oracle 作者:dingjun123 时间:2026-05-16 22:52:35 0 删除 编辑

Oracle中基于直方图的连接基数(Join Cardinality)估计算法的关键技术要点:

一、基本概念

1. 连接基数公式基础

text
Join Cardinality = 
  (T1行数 × T2行数) × Join Selectivity

2. 连接选择性(Join Selectivity)计算

  • 无直方图时 : 1/MAX(NDV1, NDV2)

  • 有直方图时 :基于值分布频率的加权计算

二、直方图类型与算法差异

1. 频率直方图(Frequency Histogram)

sql
Join Cardinality = SUM[freq_t1(i) × freq_t2(i)]WHERE value_t1(i) = value_t2(i)

特点 :

  • 每个distinct value一个bucket

  • 直接存储每个值的频率

  • 连接计算精确

2. 等高直方图(Height-Balanced Histogram)

算法步骤 :

  1. 对齐两个直方图的bucket边界

  2. 对重叠区间进行选择性估计

  3. 假设每个bucket内均匀分布

3. 混合直方图(Hybrid Histogram)- Oracle 12c+

处理方式 :

  • Popular values :精确频率匹配

  • Non-popular values :使用密度(density)估计

三、关键算法细节

1. 频率直方图连接算法

sql
-- 示例计算Join Selectivity = 
  SUM_{匹配值} (freq_t1/total_t1 × freq_t2/total_t2)

2. 多列直方图连接

  • 当连接条件涉及多列时,使用多列统计信息

  • 考虑列间相关性

3. 密度(Density)计算

text
density = 1 / (NDV × (1 - sum(freq_popular^2)))

四、实际案例分析

1. 偏斜数据连接

  • 当数据分布高度偏斜时,直方图显著改善估计精度

  • 对等值连接尤其重要

2. 连接类型影响

  • 等值连接 :直方图效果最佳

  • 范围连接 :使用端点密度估计

  • 外连接 :需要调整基数计算

五、优化器行为

1. 动态采样

  • 当统计信息不足时,自动使用动态采样

  • 11g+ 默认对未分析表进行动态采样

2. 扩展统计信息

sql
-- 创建列组统计BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    method_opt => 'FOR COLUMNS (col1, col2)'
  );END;

六、性能影响与最佳实践

1. 直方图收集策略

  • 对连接列且数据偏斜的列收集直方图

  • 避免过度收集直方图(bucket数量控制)

2. 常见问题

  • 过时统计信息 :导致连接顺序错误

  • 绑定变量窥视 :影响直方图使用

  • 直方图桶数不足 :无法准确描述复杂分布

七、诊断工具

1. 查看直方图信息

sql
SELECT column_name, histogram, num_bucketsFROM user_tab_col_statisticsWHERE table_name = 'TABLE_NAME';

2. 跟踪优化器决策

sql
ALTER SESSION SET tracefile_identifier = 'join_card';ALTER SESSION SET events 'trace[optimizer.*]';

八、参考公式(复杂情况)

对于非等值连接:

text
Join Cardinality = 
  T1_rows × T2_rows × 
  (1 - Π(1 - overlap_ratio(i)))

总结要点

  1. 直方图核心价值 :解决数据偏斜导致的基数估计错误

  2. 算法选择 :根据直方图类型采用不同计算方法

  3. 实践建议 :

    • 对高频连接列收集适当直方图

    • 监控执行计划中的基数估计与实际行数差异

    • 使用SQL Profile或SPM固定好的执行计划


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3146065/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-07

  • 博文量
    45
  • 访问量
    90568