分区剪枝是指优化器自动从FROMWHERE字句里根据分区键提取出需要扫描的分区,减少扫描的数据块,从而避免全表扫描,提高性能。

分区剪枝机制支持以下两种剪枝方式:

  • 排除约束
  • 快速剪枝

排除约束

参数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

    示例:

    1. 首先指定一个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)
      )                
    2. 在该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,也可以是更为复杂的包含运算符ANDBETWEEN的表达式,例如:

    WHERE size > 100 AND size <= 200 WHERE size BETWEEN 100 AND 200
    说明 快速剪枝不支持包含 ORIN运算符的表达式。

    示例:

    1. 首先指定一个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)
      )
    2. 在该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分区