支持多级分区表上创建全局索引

PolarDB PostgreSQL版(兼容Oracle)支持在多级分区表上以及分区键上创建全局索引(Global Index)。

前提条件

PolarDB PostgreSQL版(兼容Oracle)的内核小版本需为20230930(v1.1.35)版本及以上。

注意事项

  • 在多级分区中,Global Index只能创建在root table上(最顶级的分区表),不能创建在中间分区表。

  • 在分区键上创建Global index不一定比分区键上的Local Index更高效。例如,等值查询,Local Index的性能应该优于Global Index;但是在hash分区上的分区键范围查询,Global Index依然优于Local Index。优化器会自动选择最优路径进行查询,但是数据库可以根据业务场景选择建立合适的Index,减轻优化器的工作。

示例

  1. 创建一张多级分区表。

    CREATE TABLE sales
    (
      dept_no     number,
      part_no     varchar2,
      country     varchar2(20),
      date        date,
      amount      number
    )
    PARTITION BY RANGE(date)
      SUBPARTITION BY LIST(country)
      (
        PARTITION q1_2012
          VALUES LESS THAN('2012-Apr-01')
          (
            SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
            SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
            SUBPARTITION q1_americas VALUES ('US', 'CANADA')
          ),
      PARTITION q2_2012
        VALUES LESS THAN('2012-Jul-01')
          (
            SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
            SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
            SUBPARTITION q2_americas VALUES ('US', 'CANADA')
          ),
      PARTITION q3_2012
        VALUES LESS THAN('2012-Oct-01')
          (
            SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
            SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
            SUBPARTITION q3_americas VALUES ('US', 'CANADA')
          ),
      PARTITION q4_2012
        VALUES LESS THAN('2013-Jan-01')
          (
            SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
            SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
            SUBPARTITION q4_americas VALUES ('US', 'CANADA')
          )
    );
  2. 在多级分区表上创建Global Index。

    CREATE index sales_part_no_idx_global ON sales(part_no) global ;
    
    explain (costs off) SELECT * FROM sales WHERE part_no = '101';
                            QUERY PLAN                         
    -----------------------------------------------------------
     Global Index Scan using sales_part_no_idx_global on sales
       Index Cond: ((part_no)::text = '101'::text)
  3. 在分区键上创建Global Index。

    CREATE index sales_date_idx_global ON sales(date) global ;
    
    explain (costs off) SELECT * FROM sales WHERE date = '2012-08-01';
                           QUERY PLAN                       
    --------------------------------------------------------
     Global Index Scan using sales_date_idx_global on sales
       Index Cond: (date = '01-AUG-12 00:00:00'::date)