kudu里有个优化技术叫index skip scan,其原理和EsgynDB的mdam优化技术非常相似。下面简单介绍一下其原理。假设用户的查询sql以及表结构如下:
CREATE TABLE metrics (
host STRING,
tstamp INT,
clusterid INT,
role STRING,
PRIMARY KEY (host, tstamp, clusterid)
);
SELECT clusterid FROM metrics WHERE tstamp = 100;
查询条件落在tstamp列上,缺失了主键第一列,所以无法走到主键扫描。正常来说这条sql查询只能退化成全表扫描。但是kudu可以可以根据主键索引得到第一列host的具体值,补全第一列后再进行查询。具体流程如下:
第一次查询host=helium, tstamp=100
第二次查询host=ubuntu,tstamp=100
依次遍历所有host值,得到所有结果。

Index skip scan可以在缺失主键第一列的情况下,自动补全主键第一列,将全表扫描转换成多次主键扫描。在大部分情况下这样做都会有性能提升。但是显而易见如果主键第一列的取值非常多,反而会导致性能下降。据测试临界点大约是主键第一列值数量的平方等于全表总行数时。目前kudu中该优化默认开启,并且没有判断主键第一列取值数以决定是否关闭该优化的能力。这是后续需要改进的。另外目前只支持=谓词,尚且不支持范围谓词,以及IN谓词。


1341

被折叠的 条评论
为什么被折叠?



