首先,我们先来理解"X"表达的是什么
这里的"x"表达的是在把原本的桶分成 y 份后的顺序的第 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两个桶的数据。