计算下推

多元索引提供了条件过滤、聚合、排序等功能,在创建多元索引后,使用SQL查询时,系统能够充分利用多元索引的计算能力,将部分SQL计算任务下推到多元索引执行,避免全表扫描,从而提高计算效率。

说明

关于多元索引的更多信息,请参见多元索引介绍

使用场景

如果多元索引包含SQL中涉及的数据列,则SQL引擎会通过多元索引读取数据并下推多元索引支持的算子。例如有一张表exampletablea、b、cd四列,多元索引中包含了b、cd三列并均建立了索引,只有当SQL语句中只涉及b、cd中的数据列时,才会通过多元索引读取数据。

SELECT a, b, c, d FROM exampletable; /* 多元索引不包含a,b,c,d,扫描全表读取数据,不支持算子下推 */
SELECT b, c, d FROM exampletable;    /* 多元索引包含b,c,d,通过多元索引读取数据,支持算子下推 */

前提条件

支持下推的算子

当前SQL语句中支持下推到多元索引执行的算子说明请参见下表。

算子类型

下推算子

下推限制

逻辑运算符

AND、OR

不支持NOT算子下推。

关系运算符

=、!=、<、<=、>、>=、BETWEEN ... AND ...

只有数据列和常数的比较才支持算子下推,不支持数据列和数据列比较的算子下推。

SELECT * FROM exampletable WHERE a > 1;  /* 数据列和常数比较,支持算子下推 */
SELECT * FROM exampletable WHERE a > b;  /* 数据列和数据列比较,不支持算子下推 */

聚合函数

  • 基础聚合:MIN、MAX、COUNT、AVG、SUM、ANY_VALUE

  • 去重聚合:COUNT(DISTINCT col_name)

  • 分组函数:GROUP BY col_name

聚合函数可以对全部数据或者GROUP BY分组中的数据进行聚合,只有聚合函数支持下推并且函数参数为数据列时才支持算子下推。

SELECT COUNT(*) FROM exampletable;           /* 特殊用法COUNT(*),支持算子下推 */
SELECT SUM(a) FROM exampletable;             /* 参数为数据列,支持算子下推 */
SELECT a, b FROM exampletable GROUP BY a, b; /* 按照数据列分组,支持算子下推 */
SELECT a FROM exampletable GROUP BY a+1;     /* 按照表达式分组,不支持算子下推 */
SELECT SUM(a+b) FROM exampletable;           /* 参数为表达式,不支持算子下推 */

LIMIT

  • LIMIT row_count

  • ORDER BY col_name LIMIT row_count

ORDER BY的参数为数据列时才支持算子下推。

SELECT * FROM exampletable ORDER BY a LIMIT 1;     /* 按照数据列排序,支持算子下推 */
SELECT * FROM exampletable ORDER BY a, b LIMIT 1;  /* 按照数据列排序,支持算子下推 */
SELECT * FROM exampletable ORDER BY a+1 LIMIT 1;   /* 按照表达式排序,不支持算子下推 */