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

本文探讨数据库优化中的Cardinality估算,它是成本模型的关键。传统方法依赖于Histogram,但误差明显。文章介绍了使用Sampling方法来更准确地计算Cardinality,特别是在涉及JOIN操作时,通过在表上采样并计算符合JOIN条件的记录比例,来预测JOIN的大小。这种方法对于优化查询性能尤其有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景介绍
数据库优化器最重要的一个内容就是计算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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WeChat098

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

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

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

打赏作者

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

抵扣说明:

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

余额充值