可获得性
本特性自MogDB 5.0.6版本开始引入。
特性简介
支持列裁剪消除子查询中冗余的投影列,提高SQL性能。
客户价值
识别并删除子查询结果中不需要的列,以提高查询效率,减少查询执行的开销,提高性能。
特性描述
列裁剪(Column Pruning)是数据库优化的一种技术,它指的是数据库查询执行引擎在执行查询时识别和删除不需要的列。这些不需要的列通常是查询结果集中的冗余列,它们在查询计划中被识别并消除,以减少查询执行的开销和提高性能。
消除子查询中冗余的投影列意味着数据库系统在执行子查询时,会识别并删除子查询结果中不需要的列,以提高查询的效率。这样做有助于减少查询所需的计算资源和内存消耗,从而加速查询的执行。
当查询涉及到复杂的查询计划和大量数据时,通过识别和消除不必要的列,数据库系统可以更有效地执行查询,减少资源消耗,并提高系统的响应速度。
参数说明
GUC参数rewrite_rule新增选项column_pruner,用于控制是否开启消除子查询中冗余投影列的功能,默认关闭。设置rewrite_rule为column_pruner时开启本功能。
SET rewrite_rule='column_pruner';
特性约束
- 不满足重写规则的SQL不会执行报错,语句未按重写规则处理,正常执行。
- 被外部查询引用的列仍会被保留。
- 查询中order/group/distinct/filter/SW等子句涉及的列不会被消除。
- 仅支持对INLINE为子查询的CTE进行重写优化。
- 支持对视图和子查询按规则重写。
- 查询中列包含returning-set或volatile函数不会消除。
- 本特性支持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)
性能测试结果
- 列裁剪性能在含有join消除或多windowfunc的查询场景中具有明显的提升效果,其中在列存表的多agg&windowfunc场景中提升效果最高达到90%,行存表中最高达到69%。
- Sort场景性能提升效果不明显,误差范围内可能基本无提升。
- 列裁剪功能在列存表上的性能提升效果,大体上优于行存表。
- 并行查询的开启会进一步优化性能提升效果,但开启前后,列存表的多agg&windowfunc场景性能提升均为90%。
- 以行存表join消除的场景测试中,得出work_mem参数对列裁剪功能的查询耗时基本无影响。
- 客户场景为列裁剪功能的典型场景,性能提升效果十分显著,达到94%,query_dop=8时,进一步提升到98%。
相关页面
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




