Cardinality estimate-基数估计中基于直方图(Histogram)和采样(Sampling)的方法

一、背景介绍
数据库优化器最重要的一个内容就是计算cardinality,因为cost model是要通过cardinality来的最后的cost的(当然很多cost model不好,就算cardinality准确,得到的cost也是错误的,这个在另外的专题再去讨论)。Cardinality是什么:给定predicate,满足这个predicate的tuple数量,predicate里包括查询条件和join。

传统计算cardinality方法是基于histogram,下面简单介绍一下什么是histogram。数据库的histogram一般是基于列的统计,也就是说每一列都有一个histogram。如下图1是列f的histogram,列f一共有14个唯一值0~14(注意,10是没有的),平均分为了5个区间(每个区间称之为bin)[0,2],[3,5],[6,8],[9,11],[12,14]。每个区间对应了#records,即这个区间有多少个records,在每个区间内的分布为均匀分布。

图1 列f的histogram
如果我们要计算predicate(f=1)的cardinality,那么在histogram查一下f=1对应的bin平均包含了3条记录,则输出cardinality为3;如果计算predicate(f=12)的cardinality,定位到第5个bin,平均包含5个record,则输出cardinality为5,而实际为2,这个就是histogram的误差。

二、Sampling方法
本文是要介绍sampling计算cardinality,那么具体怎么做呢?简单的方法就是在f列上随机sample 100个记录,看一下符合predicate有几个,假如有4个,那么符合predicate的概率为4/100,而f一共包含了1,000,000条记录,那么cardinality的结果为4/100*1,000,000=40000。

上面是单表(不包含join)的情况算起来很简单,实际上sampling主要用来处理有join的cardinality的估计,也就是去算join size的大小。比如先在A表上sample 100个records,B表上也sample 100个records,再针对sample结果做join,符合join条件的有4个records,即比率为4/100,那么A表1,000,000大小(假设B表也100万大小)情况下,join size为40000。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeChat098

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值