全部產品
Search
文件中心

PolarDB:分區剪枝

更新時間:Dec 19, 2024

分區剪枝是指最佳化器自動從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分區