浅谈bucket x out of y on condition

首先,我们先来理解"X"表达的是什么 

       这里的"x"表达的是在把原本的桶分成 份后的顺序的第 个,来个简单的例子:例如有个表被分成了4个buckets,那么这个时候运行 bucket 1 out of  4 on id(我们暂时默认以id分),这句话表示就是把原本的buckets分成4份,取第一份的数据,即取第一桶的数据。到这里只是最简单的形式。

然后我们来看"Y" 表达的是什么

此时可以分为两类:1.Y>buckets的数目    2.Y<buckets的数目

结合x一起来看第一种情况:假设buckets数目有4个,Y=8,x=2

那么这时候很明显只有4个不够8个,这时候它会切分成8份,简单来说会把每一个bucket平均分成两份。下面重点来了,这8个会怎么排序呢? (我简单的画个草图)

他会形成A1,B1 , C1 , D1 , A2 , B2 , C2 , D2以这样的顺序排序。

可以进行验证的:例如我用bucket 1 out of 4 on id,结果如下(我的表用id分成了4个桶)

 

 

可以看到(截取出来的一个字段信息),很明显这是第一个桶内的信息(参考我上面开头刚说的)

employee_id_buckets3.employee_id  
-----------------------------------
124                                            |
120                         
116                         
112 
108                        
104                            
100   

如果我用bucket 5 out of 8 on id 时,结果如下:

employee_id_buckets3.employee_id  
-----------------------------------
124                                            |
116                         
108                        
100   

这里可以看出这是第一个桶内的部分信息。

再来看看我刚刚用的两条命令

select * from employee_id_buckets3 tablesample(bucket 1 out of 4 on employee_id);
select * from employee_id_buckets3 tablesample(bucket 5 out of 8 on employee_id);

一对比,效果很显然,A2在分成8份时,排序时第五位。

结合x一起来看第二种情况:假设buckets数目有4个,Y=2,x=2

如果你上面搞懂了,这个就很简单了。

这时候bucket会合成2份,也就是参数Y的值。那么这时候要明白他是如何分的:如果我们把4个桶编号成A,B,C,D,

那么会他会从前往后分发,先把份数满足,然后多的,在从头分发,所以形成了AC,BD两份

select * from employee_id_buckets3 tablesample(bucket 1 out of 2 on employee_id);

他会取第一个桶内的数据。就是AC两个桶的数据。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值