表下推优化器规则

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

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

  1. ANALYZE tableName;

User Hint Comment-

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

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

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

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

Original Query-

  1. SELECT
  2. Sum(lineitem.extendedprice) / 7.0 AS avg_yearly
  3. FROM
  4. lineitem,
  5. part,
  6. (
  7. SELECT
  8. 0.2 * Avg(lineitem.quantity) AS s_avg, lineitem.partkey AS s_partkey
  9. FROM
  10. lineitem
  11. GROUP BY
  12. lineitem.partkey
  13. )
  14. WHERE
  15. part.partkey = lineitem.partkey
  16. AND
  17. part.brand = 'Brand#43'
  18. AND
  19. part.container = 'LG PACK'
  20. AND
  21. part.partkey = s_partkey
  22. AND
  23. lineitem.quantity < s_avg /* #distinct@ part = partkey #*/;

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

Equivalent Rewritten Query-

  1. SELECT
  2. Sum(lineitem.extendedprice) / 7.0 AS avg_yearly
  3. FROM
  4. lineitem,
  5. (
  6. SELECT
  7. 0.2 * Avg(lineitem.quantity) AS s_avg, lineitem.partkey AS s_partkey
  8. FROM
  9. lineitem, part
  10. WHERE
  11. part.brand = 'Brand#43'
  12. AND
  13. part.container = 'LG PACK'
  14. AND
  15. part.partkey = lineitem.partkey
  16. GROUP BY
  17. lineitem.partkey
  18. )
  19. WHERE
  20. s_partkey = lineitem.partkey
  21. AND
  22. lineitem.quantity < s_avg;

The feature is disabled by default. The user can enable it by executing the following command to set the session parameter-

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

  1. SET SESSION push_table_through_subquery = true;