文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

支持裁剪子查询投影列

可获得性

本特性自MogDB 5.0.6版本开始引入。

特性简介

支持列裁剪消除子查询中冗余的投影列,提高SQL性能。

客户价值

识别并删除子查询结果中不需要的列,以提高查询效率,减少查询执行的开销,提高性能。

特性描述

列裁剪(Column Pruning)是数据库优化的一种技术,它指的是数据库查询执行引擎在执行查询时识别和删除不需要的列。这些不需要的列通常是查询结果集中的冗余列,它们在查询计划中被识别并消除,以减少查询执行的开销和提高性能。

消除子查询中冗余的投影列意味着数据库系统在执行子查询时,会识别并删除子查询结果中不需要的列,以提高查询的效率。这样做有助于减少查询所需的计算资源和内存消耗,从而加速查询的执行。

当查询涉及到复杂的查询计划和大量数据时,通过识别和消除不必要的列,数据库系统可以更有效地执行查询,减少资源消耗,并提高系统的响应速度。

参数说明

GUC参数rewrite_rule新增选项column_pruner,用于控制是否开启消除子查询中冗余投影列的功能,默认关闭。设置rewrite_rule为column_pruner时开启本功能。

SET rewrite_rule='column_pruner';

特性约束

  1. 不满足重写规则的SQL不会执行报错,语句未按重写规则处理,正常执行。
  2. 被外部查询引用的列仍会被保留。
  3. 查询中order/group/distinct/filter/SW等子句涉及的列不会被消除。
  4. 仅支持对INLINE为子查询的CTE进行重写优化。
  5. 支持对视图和子查询按规则重写。
  6. 查询中列包含returning-set或volatile函数不会消除。
  7. 本特性支持A/PG兼容模式,B模式暂不支持。

示例

CREATE TABLE t1(a INT, b INT);
CREATE TABLE t2(a INT PRIMARY KEY, b INT);
SET rewrite_rule='column_pruner';

explain verbose SELECT a
FROM (
    SELECT t1.a
        ,count(t2.a)
        ,DENSE_RANK() OVER (
            ORDER BY t1.a
            ) AS RANK
    FROM t1
    LEFT JOIN t2 ON t1.a = t2.a
    GROUP BY t1.a
    );
    
                            QUERY PLAN
-------------------------------------------------------------------
 HashAggregate  (cost=36.86..38.86 rows=200 width=4)
   Output: t1.a
   Group By Key: t1.a
   ->  Seq Scan on public.t1  (cost=0.00..31.49 rows=2149 width=4)
         Output: t1.a
(5 rows)

性能测试结果

  1. 列裁剪性能在含有join消除或多windowfunc的查询场景中具有明显的提升效果,其中在列存表的多agg&windowfunc场景中提升效果最高达到90%,行存表中最高达到69%。
  2. Sort场景性能提升效果不明显,误差范围内可能基本无提升。
  3. 列裁剪功能在列存表上的性能提升效果,大体上优于行存表。
  4. 并行查询的开启会进一步优化性能提升效果,但开启前后,列存表的多agg&windowfunc场景性能提升均为90%。
  5. 以行存表join消除的场景测试中,得出work_mem参数对列裁剪功能的查询耗时基本无影响。
  6. 客户场景为列裁剪功能的典型场景,性能提升效果十分显著,达到94%,query_dop=8时,进一步提升到98%。

相关页面

rewrite_rule

Copyright © 2011-2024 www.enmotech.com All rights reserved.