全部產品
Search
文件中心

PolarDB:支援多級分區表上建立全域索引

更新時間:Aug 23, 2024

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)