介绍
为了支持类似于Postgresql和T-SQL语法的表采样,自Phoenix 4.12起,已将TABLESAMPLE子句合并到表别名ref中。常规语法。此功能将表返回的行为百分比。有关实现的详细信息,请参见PHOENIX-153。
Bernoulli(伯努利试验)(基于一致性哈希的表采样)可实现此功能,在给定总体行上实现Bernoulli抽样。执行后,给定采样率,它利用Phoenix的统计数据以及HBase的区域分布来进行表格抽样。
在等距字节的行创建一个guide port(行参照),当需要采样时,在每个区域的每个guide port上重复应用伯努利试验程序,其概率与采样率成比例。包含的guide port将导致此guide port与下一个guide port之间的所有行都包含在样本总体中。作为统计信息的一部分。
To support table sampling, similar to the Postgresql and T-SQL syntax, a TABLESAMPLE clause has been encorporated into the table aliases ref as of Phoenix 4.12. The general syntax is described here. This feature limits the number of rows returned from a table to a PERCENT of rows. See PHOENIX-153 for implementation details.-------phoenix官网
性能
在采样率为100%的表上进行采样将花费与不进行采样的查询相同的计算资源量。当选择较小的采样率时,资源消耗迅速下降。通常,采样过程的均摊时间复杂度为O(k + mn),其中n是采样的hbase表的区域数,m是指guide port的数量,k是采样数的大小。
可重复性
可重复性意味着它可以保证在同一张表上重复采样将得到相同的采样结果。
当采样过程开始时,通过对每个区域的每个guide port的开始rowkey的二进制表示应用一致的哈希处理,可以实现可重复的功能。在散列期间,默认情况下采用采用lazy mod方法的FNV1实现。参见FNV1。
例子
例如,要对表进行表采样,您将执行以下命令。请注意,采样率是介于0和100之间(包括0和100)的数字值。
select * from PERSON TABLESAMPLE(12.08);
select * from PERSON TABLESAMPLE (12.08) where ADDRESS = 'CA' OR name>'aaa';
select count( * ) from PERSON TABLESAMPLE (12.08) LIMIT 2
select count( * ) from (select NAME from PERSON TABLESAMPLE (49) limit 20)
select * from (select /+NO_INDEX/ * from PERSON tablesample (10) where Name > 'tina10') where ADDRESS = 'CA'
select * from PERSON1, PERSON2 tablesample (70) where PERSON1.Name = PERSON2.NAME
select /+NO_INDEX/ count( * ) from PERSON tableSample (19), US_POPULATION tableSample (28) where PERSON.Name > US_POPULATION.STATE
upsert into personbig(ID, ADDRESS) select id, address from personbig tablesample (1);
聚合查询
select count( * ) from PERSON TABLESAMPLE (49) LIMIT 2
select count( * ) from (select NAME from PERSON TABLESAMPLE (49) limit 20)
解释查询
explain select count( * ) from PERSON TABLESAMPLE (49) LIMIT 2)
注意事项
- 由于采样过程的缘故,应谨慎使用TABLESAMPLE子句。例如,两个表的联接可能会返回两个表中每一行的匹配项;但是,当对两个表中的一个表或两个表应用表采样过程时,如果不进行采样,则联接可能与预期不符。
- 需要收集统计信息以获得最佳采样精度。要打开统计信息收集,请参阅统计信息。
ALTER TABLE my_table SET GUIDE_POSTS_WIDTH = 10000000