數據分區消除指的是數據庫服務器根據查詢謂詞確定只需要訪問表的一部分數據分區就可以實現查詢的能力。當對分區表運行決策支持查詢時,數據分區消除可以提供特定好處。
分區表使用了數據組織方案,即,表數據根據該表中一個或多個表分區鍵列中的值分布到多個存儲對象(稱為數據分區或范圍)中。根據 CREATE TABLE 語句的 PARTITION BY 子句中指定的內容,給定表的數據被劃分到多個存儲對象中。這些存儲對象可以在不同的表空間中,也可以在相同表空間中。
以下示例演示了數據分區消除所產生的性能方面的好處。如果發出以下語句:
CREATE TABLE custlist(subsdate DATE, Province CHAR(2), AccountID INT)
PARTITION BY RANGE(subsdate)
(STARTING FROM '1/1/1990' IN ts1,
STARTING FROM '1/1/1991' IN ts1,
STARTING FROM '1/1/1992' IN ts1,
STARTING FROM '1/1/1993' IN ts2,
STARTING FROM '1/1/1994' IN ts2,
STARTING FROM '1/1/1995' IN ts2,
STARTING FROM '1/1/1996' IN ts3,
STARTING FROM '1/1/1997' IN ts3,
STARTING FROM '1/1/1998' IN ts3,
STARTING FROM '1/1/1999' IN ts4,
STARTING FROM '1/1/2000' IN ts4,
STARTING FROM '1/1/2001' ENDING '12/31/2001' IN ts4);
假定您對 2000 年的客戶信息感興趣。如果發出以下查詢:
SELECT * FROM custlist WHERE subsdate BETWEEN '1/1/2000' AND '12/31/2000';
正如圖 101所顯示的那樣,數據庫服務器確定只需要訪問表空間 4(ts4)中的一個數據分區就可以解決此查詢。
圖 101. 分區表上數據分區消除所產生的性能方面的好處
圖 圖 102 中顯示的另一個數據分區消除示例是索引掃描,它涉及兩個索引并根據以下方案進行掃描:
CREATE TABLE multi (sale_date date, region char(2))
PARTITION BY (sale_date)
(STARTING '01/01/2005' ENDING '12/31/2005' EVERY 1 MONTH);
CREATE INDEX sx ON multi(sale_date);
CREATE INDEX rx ON multi(region);
如果發出以下查詢:
SELECT * FROM multi WHERE
sale_date BETWEEN '6/1/2005' AND '7/31/2005' AND REGION = 'NW';
圖 102. 表分區和索引“與”(AND)的優化器決策路徑
在不使用表分區時,一種可能的方案是索引“與”(AND)。索引“與”(AND)執行下列任務:
- 讀取每個索引中的所有相關索引條目
- 保存兩組行標識(RID)
- 匹配 RID 以確定哪些 RID 同時出現在這兩個索引中
- 使用 RID 來訪存行
如圖 102 中所示,在使用表分區的情況下,讀取索引以查找 region 和 sale_date 的匹配項,從而允許快速檢索匹配行。
DB2 說明
還可以使用 DB2 說明來確定 DB2 優化器選擇的分區消除。DP Elim Predicates 信息顯示掃描了哪些數據分區來解決以下查詢:
SELECT * FROM custlist WHERE subsdate
BETWEEN '12/31/1999' AND '1/1/2001'
Arguments:
---------
DPESTFLG: (Number of data partitions accessed are Estimated)
FALSE
DPLSTPRT: (List of data partitions accessed)
9-11
DPNUMPRT: (Number of data partitions accessed)
3
DP Elim Predicates:
------------------
Range 1)
Stop Predicate: (Q1.A <= '01/01/2001')
Start Predicate: ('12/31/1999' <= Q1.A)
Objects Used in Access Plan:
---------------------------
Schema: MRSRINI
Name: CUSTLIST
Type: Data Partitioned Table
Time of creation: 2005-11-30-14.21.33.857039
Last statistics update: 2005-11-30-14.21.34.339392
Number of columns: 3
Number of rows: 100000
Width of rows: 19
Number of buffer pool pages: 1200
Number of data partitions: 12
Distinct row values: No
Tablespace name: <VARIOUS>
多列支持
在使用多個列作為表分區鍵的情況下,數據分區消除將起作用。
例如,如果發出以下語句:
CREATE TABLE sales (year INT, month INT)
PARTITION BY RANGE(year, month)
(STARTING FROM (2001, 1) ENDING AT(2001,3) IN ts1,
ENDING AT(2001,6) IN ts2,
ENDING AT(2001,9) IN ts3,
ENDING AT(2001,12) IN ts4,
ENDING AT(2002,3) IN ts5,
ENDING AT(2002,6) IN ts6,
ENDING AT(2002,9) IN ts7,
ENDING AT(2002,12) IN ts8)
接著,發出以下查詢:
SELECT * FROM sales WHERE year = 2001 AND month < 8
查詢優化器推斷只需要訪問 ts1、ts2 和 ts3 中的數據分區就可以解決此查詢。
注:
在多個列組成表分區鍵的情況下,只有當擁有組合鍵的前導列上的謂詞時才能實現數據分區消除,因為用于表分區鍵的非前導列不是獨立的。
多范圍支持
可以使用多個范圍在數據分區上實現數據分區消除(即,一起執行“或”(OR)運算)。通過使用上一個示例中創建的表,執行下列查詢:
SELECT * FROM sales
WHERE (year = 2001 AND month <= 3) OR (year = 2002 and month >= 10)
數據庫服務器只訪問 2001 年的第一季度和 2002 年的最后一個季度的數據。
生成列
可以將生成列用作表分區鍵。
例如,可以發出以下語句:
CREATE TABLE sales(a INT, b INT GENERATED ALWAYS AS (a / 5))
IN ts1,ts2,ts3,ts4,ts5,ts6,ts7,ts8,ts9,ts10
PARTITION BY RANGE(b)
(STARTING FROM (0) ENDING AT(1000) EVERY (50))
在此示例中,將生成列上的謂詞用于數據分區消除。此外,當用來生成列的表達式是單調的時,數據庫服務器會將源列上的謂詞轉換為生成列上的謂詞,從而在生成列上啟用數據分區消除。
例如,如果具有以下查詢:
SELECT * FROM sales WHERE a > 35
數據庫服務器根據(a > 35)在 b(b > 7)上生成額外謂詞,從而允許數據分區消除。
連接謂詞
如果將連接謂詞下推到表訪問級別,則也可以在數據分區消除中使用連接謂詞。連接謂詞僅在嵌套循環連接(NLJN)的內部才下推到表訪問級別。
請考慮下列表:
CREATE TABLE T1(A INT, B INT)
PARTITION BY RANGE(A, B)
(STARTING FROM (1, 1)
ENDING (1,10) IN ts1, ENDING (1,20) IN ts2,
ENDING (2,10) IN ts3, ENDING (2,20) IN ts4,
ENDING (3,10) IN ts5, ENDING (3,20) IN ts6,
ENDING (4,10) IN ts7, ENDING (4,20) IN ts8)
CREATE TABLE T2 (A INT, B INT)
使用的謂詞有:
P1: T1.A = T2.A
P2: T1.B > 15
在此示例中,由于不知道連接的外值,因此不能確定將在編譯時訪問的額外數據分區。在這種情況下,以及在使用主變量或參數標記的情況下,當綁定必需的值時,就會發生數據分區消除。
在運行時,當 T1 是 NLJN 的內部表時,會根據 T2.A 的每個外值的謂詞自動進行數據分區消除。在運行時,對外值 T2.A = 3 應用謂詞 T1.A = 3 和 T1.B > 15,這樣就限定了訪問的表空間 ts6 和 ts7 中的數據分區。
考慮表 T1 和 T2 中的列 A 具有下列值:
外部表 T2:列 A |
內部表 T1:列 A |
內部表 T1:列 B |
內部表 T1:數據分區位置 |
2 |
3 |
20 |
ts6 |
3 |
2 |
10 |
ts3 |
3 |
2 |
18 |
ts4 |
|
3 |
15 |
ts6 |
|
1 |
40 |
ts3 |
要執行嵌套循環連接(假定對內部表進行表掃描),數據庫管理器執行下列步驟:
- 讀取 T2 中的第一行。A 的值是 2。
- 在連接謂詞 T1.A = T2.A 中將 T2.A 值(它是 2)綁定到列 T2.A。該謂詞就變成 T1.A = 2。
- 使用謂詞 T1.A = 2 和 T1.B > 15 應用數據分區消除。這將限定表空間 ts4 和 ts5 中的數據分區。
- 在應用 T1.A = 2 和 T1.B > 15 之后,掃描表 T1 的表空間 ts4 和 ts5 中的數據分區,直到找到一行為止。找到的第一個合格行是 T1 的行 3。
- 連接匹配的行。
- 掃描表 T1 的表空間 ts4 和 ts5 中的數據分區,直到找到下一個匹配項(T1.A = 2 和 T1.B > 15)為止。再也找不到其他行。
- 對 T2 的下一行(將 A 的值替換為 3)重復步驟 1 至 6,直到用完 T2 中的所有行為止。
posted on 2007-08-21 10:44
安文豪 閱讀(1192)
評論(0) 編輯 收藏