表下推优化器规则

openLooKeng支持Table下推优化器规则,以改善符合条件的查询延迟。

用户须执行以下命令为SQL查询中的所有表生成stats,以便根据表的大小对连接源重新排序-

ANALYZE tableName;

User Hint Comment-

用户还可以添加以下格式的特别注释,通过指定表名及其不重复(主键)列名,来利用表下推规则的好处。

/* #distinct@ table1 = col1, col2, ... #*/

此提示是可选的,因为如果表有相关统计信息, openLookeng可以标识所有不同的列。

以下查询(由TPC-H Benchmark的Query 17修改而来)就是一个满足条件的查询,将外层表推入子查询,从而提升整体查询时延。

Original Query-

SELECT 
  Sum(lineitem.extendedprice) / 7.0 AS avg_yearly 
FROM 
  lineitem, 
  part, 
(
  SELECT 
    0.2 * Avg(lineitem.quantity) AS s_avg, lineitem.partkey AS s_partkey 
  FROM 
    lineitem 
  GROUP BY 
    lineitem.partkey 
) 
WHERE 
  part.partkey = lineitem.partkey 
AND 
  part.brand = 'Brand#43' 
AND 
  part.container = 'LG PACK' 
AND 
  part.partkey = s_partkey 
AND 
  lineitem.quantity < s_avg /* #distinct@ part = partkey #*/;

在上述查询中,表part是相关的外部查询表,以partkey为唯一列,与表lineitem连接。下面给出一个等价的重写后的查询语句,将part表推入到子查询。

Equivalent Rewritten Query-

SELECT 
  Sum(lineitem.extendedprice) / 7.0 AS avg_yearly 
FROM 
  lineitem, 
(
  SELECT 
    0.2 * Avg(lineitem.quantity) AS s_avg, lineitem.partkey AS s_partkey 
  FROM 
    lineitem, part 
  WHERE 
    part.brand = 'Brand#43' 
  AND 
    part.container = 'LG PACK' 
  AND 
    part.partkey = lineitem.partkey 
  GROUP BY 
    lineitem.partkey
) 
WHERE 
  s_partkey = lineitem.partkey 
AND 
  lineitem.quantity < s_avg;

该功能默认是关闭状态。用户可以通过以下命令设置session参数来启用该功能-

SET SESSION push_table_through_subquery = true;