分区剪枝是指优化器自动从FROM和WHERE子句里根据分区键提取出需要扫描的分区,减少扫描的数据块,从而避免全表扫描,提高性能。
分区剪枝机制支持以下两种剪枝方式:
排除约束
快速剪枝
排除约束
参数constraint_exclusion用于控制排除约束,取值范围:on、off 或partition,默认为partition。如果参数constraint_exclusion为partition或on,则表示启用排除约束;如果为off,则表示不启用。
当您启用了排除约束,服务器就会检查定义给每个分区的约束来决定分区是否能满足查询。
当执行不包含WHERE子句的SELECT语句时,查询计划会推荐用于搜索整个表的执行计划。
当执行包含WHERE子句的SELECT语句时,查询计划会决定要存储记录的分区,并发送查询碎片给这个分区,然后从执行计划中剪去不能包含记录的分区。
如果您不使用分区表功能,则建议禁用排除约束,从而提高性能。
快速剪枝
和排除约束类似,快速剪枝只能对包含WHERE子句的查询进行优化,且只有当WHERE子句中的限定符满足某种格式时,才可进行优化。
参数polar_comp_enable_pruning用于控制快速剪枝,取值范围:on或off,默认为on。如果参数polar_comp_enable_pruning为on,则表示启用快速剪枝,快速剪去某些特定的查询;如果为off,则表示不启用。
快速剪枝无法优化对子分区表的查询,也无法优化分区于多个列上的RANGE分区表的查询。
快速剪枝的使用说明如下:
对于LIST分区表的查询,快速剪枝能快速剪去包含WHERE子句的查询,运算符为等于(=)或IS NULL/IS NOT NULL。
示例:
首先指定一个LIST分区表:
CREATE TABLE sales_hist(..., country text, ...) PARTITION BY LIST(country) ( PARTITION americas VALUES('US', 'CA', 'MX'), PARTITION europe VALUES('BE', 'NL', 'FR'), PARTITION asia VALUES('JP', 'PK', 'CN'), PARTITION others VALUES(DEFAULT) )
在该LIST分区表的基础上,使用快速剪枝,提取出包含如下WHERE子句的信息。
WHERE country = 'US' WHERE country IS NULL;
通过第一个WHERE子句, 快速剪枝将排除分区europe、asia和others,因为这些分区不满足
WHERE country = 'US'
。通过第二个WHERE子句, 快速剪枝将排除分区americas、europe和asia。因为这些分区不满足
WHERE country IS NULL
。
对于RANGE分区表的查询,快速剪枝能快速剪去包含WHERE子句的查询。运算符可以是等于(=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),或IS NULL/IS NOT NULL,也可以是更为复杂的包含运算符AND和 BETWEEN的表达式,例如:
WHERE size > 100 AND size <= 200 WHERE size BETWEEN 100 AND 200
说明快速剪枝不支持包含OR或IN运算符的表达式。
示例:
首先指定一个RANGE分区表:
CREATE TABLE boxes(id int, size int, color text) PARTITION BY RANGE(size) ( PARTITION small VALUES LESS THAN(100), PARTITION medium VALUES LESS THAN(200), PARTITION large VALUES LESS THAN(300) )
在该RANGE分区表的基础上,使用快速剪枝,提取出包含如下WHERE子句的信息。
WHERE size > 100 -- 扫描medium和large分区 WHERE size >= 100 -- 扫描medium和large分区 WHERE size = 100 -- 扫描medium分区 WHERE size <= 100 -- 扫描small和medium分区 WHERE size < 100 -- 扫描small分区 WHERE size > 100 AND size < 199 -- 扫描medium分区 WHERE size BETWEEN 100 AND 199 -- 扫描medium分区 WHERE color = 'red' AND size = 100 -- 扫描medium分区 WHERE color = 'red' AND (size > 100 AND size < 199) -- 扫描medium分区