數(shù)據(jù)分區(qū)消除指的是數(shù)據(jù)庫服務(wù)器根據(jù)查詢謂詞確定只需要訪問表的一部分數(shù)據(jù)分區(qū)就可以實(shí)現(xiàn)查詢的能力。當(dāng)對分區(qū)表運(yùn)行決策支持查詢時(shí),數(shù)據(jù)分區(qū)消除可以提供特定好處。
分區(qū)表使用了數(shù)據(jù)組織方案,即,表數(shù)據(jù)根據(jù)該表中一個(gè)或多個(gè)表分區(qū)鍵列中的值分布到多個(gè)存儲對象(稱為數(shù)據(jù)分區(qū)或范圍)中。根據(jù) CREATE TABLE 語句的 PARTITION BY 子句中指定的內(nèi)容,給定表的數(shù)據(jù)被劃分到多個(gè)存儲對象中。這些存儲對象可以在不同的表空間中,也可以在相同表空間中。
以下示例演示了數(shù)據(jù)分區(qū)消除所產(chǎn)生的性能方面的好處。如果發(fā)出以下語句:
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 年的客戶信息感興趣。如果發(fā)出以下查詢:
SELECT * FROM custlist WHERE subsdate BETWEEN '1/1/2000' AND '12/31/2000';
正如圖 101所顯示的那樣,數(shù)據(jù)庫服務(wù)器確定只需要訪問表空間 4(ts4)中的一個(gè)數(shù)據(jù)分區(qū)就可以解決此查詢。
圖 101. 分區(qū)表上數(shù)據(jù)分區(qū)消除所產(chǎn)生的性能方面的好處
圖 圖 102 中顯示的另一個(gè)數(shù)據(jù)分區(qū)消除示例是索引掃描,它涉及兩個(gè)索引并根據(jù)以下方案進(jìn)行掃描:
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);
如果發(fā)出以下查詢:
SELECT * FROM multi WHERE
sale_date BETWEEN '6/1/2005' AND '7/31/2005' AND REGION = 'NW';
圖 102. 表分區(qū)和索引“與”(AND)的優(yōu)化器決策路徑
在不使用表分區(qū)時(shí),一種可能的方案是索引“與”(AND)。索引“與”(AND)執(zhí)行下列任務(wù):
- 讀取每個(gè)索引中的所有相關(guān)索引條目
- 保存兩組行標(biāo)識(RID)
- 匹配 RID 以確定哪些 RID 同時(shí)出現(xiàn)在這兩個(gè)索引中
- 使用 RID 來訪存行
如圖 102 中所示,在使用表分區(qū)的情況下,讀取索引以查找 region 和 sale_date 的匹配項(xiàng),從而允許快速檢索匹配行。
DB2 說明
還可以使用 DB2 說明來確定 DB2 優(yōu)化器選擇的分區(qū)消除。DP Elim Predicates 信息顯示掃描了哪些數(shù)據(jù)分區(qū)來解決以下查詢:
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>
多列支持
在使用多個(gè)列作為表分區(qū)鍵的情況下,數(shù)據(jù)分區(qū)消除將起作用。
例如,如果發(fā)出以下語句:
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)
接著,發(fā)出以下查詢:
SELECT * FROM sales WHERE year = 2001 AND month < 8
查詢優(yōu)化器推斷只需要訪問 ts1、ts2 和 ts3 中的數(shù)據(jù)分區(qū)就可以解決此查詢。
注:
在多個(gè)列組成表分區(qū)鍵的情況下,只有當(dāng)擁有組合鍵的前導(dǎo)列上的謂詞時(shí)才能實(shí)現(xiàn)數(shù)據(jù)分區(qū)消除,因?yàn)橛糜诒矸謪^(qū)鍵的非前導(dǎo)列不是獨(dú)立的。
多范圍支持
可以使用多個(gè)范圍在數(shù)據(jù)分區(qū)上實(shí)現(xiàn)數(shù)據(jù)分區(qū)消除(即,一起執(zhí)行“或”(OR)運(yùn)算)。通過使用上一個(gè)示例中創(chuàng)建的表,執(zhí)行下列查詢:
SELECT * FROM sales
WHERE (year = 2001 AND month <= 3) OR (year = 2002 and month >= 10)
數(shù)據(jù)庫服務(wù)器只訪問 2001 年的第一季度和 2002 年的最后一個(gè)季度的數(shù)據(jù)。
生成列
可以將生成列用作表分區(qū)鍵。
例如,可以發(fā)出以下語句:
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))
在此示例中,將生成列上的謂詞用于數(shù)據(jù)分區(qū)消除。此外,當(dāng)用來生成列的表達(dá)式是單調(diào)的時(shí),數(shù)據(jù)庫服務(wù)器會將源列上的謂詞轉(zhuǎn)換為生成列上的謂詞,從而在生成列上啟用數(shù)據(jù)分區(qū)消除。
例如,如果具有以下查詢:
SELECT * FROM sales WHERE a > 35
數(shù)據(jù)庫服務(wù)器根據(jù)(a > 35)在 b(b > 7)上生成額外謂詞,從而允許數(shù)據(jù)分區(qū)消除。
連接謂詞
如果將連接謂詞下推到表訪問級別,則也可以在數(shù)據(jù)分區(qū)消除中使用連接謂詞。連接謂詞僅在嵌套循環(huán)連接(NLJN)的內(nèi)部才下推到表訪問級別。
請考慮下列表:
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
在此示例中,由于不知道連接的外值,因此不能確定將在編譯時(shí)訪問的額外數(shù)據(jù)分區(qū)。在這種情況下,以及在使用主變量或參數(shù)標(biāo)記的情況下,當(dāng)綁定必需的值時(shí),就會發(fā)生數(shù)據(jù)分區(qū)消除。
在運(yùn)行時(shí),當(dāng) T1 是 NLJN 的內(nèi)部表時(shí),會根據(jù) T2.A 的每個(gè)外值的謂詞自動(dòng)進(jìn)行數(shù)據(jù)分區(qū)消除。在運(yùn)行時(shí),對外值 T2.A = 3 應(yīng)用謂詞 T1.A = 3 和 T1.B > 15,這樣就限定了訪問的表空間 ts6 和 ts7 中的數(shù)據(jù)分區(qū)。
考慮表 T1 和 T2 中的列 A 具有下列值:
外部表 T2:列 A |
內(nèi)部表 T1:列 A |
內(nèi)部表 T1:列 B |
內(nèi)部表 T1:數(shù)據(jù)分區(qū)位置 |
2 |
3 |
20 |
ts6 |
3 |
2 |
10 |
ts3 |
3 |
2 |
18 |
ts4 |
|
3 |
15 |
ts6 |
|
1 |
40 |
ts3 |
要執(zhí)行嵌套循環(huán)連接(假定對內(nèi)部表進(jìn)行表掃描),數(shù)據(jù)庫管理器執(zhí)行下列步驟:
- 讀取 T2 中的第一行。A 的值是 2。
- 在連接謂詞 T1.A = T2.A 中將 T2.A 值(它是 2)綁定到列 T2.A。該謂詞就變成 T1.A = 2。
- 使用謂詞 T1.A = 2 和 T1.B > 15 應(yīng)用數(shù)據(jù)分區(qū)消除。這將限定表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū)。
- 在應(yīng)用 T1.A = 2 和 T1.B > 15 之后,掃描表 T1 的表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū),直到找到一行為止。找到的第一個(gè)合格行是 T1 的行 3。
- 連接匹配的行。
- 掃描表 T1 的表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū),直到找到下一個(gè)匹配項(xiàng)(T1.A = 2 和 T1.B > 15)為止。再也找不到其他行。
- 對 T2 的下一行(將 A 的值替換為 3)重復(fù)步驟 1 至 6,直到用完 T2 中的所有行為止。
posted on 2007-08-21 10:44
安文豪 閱讀(1198)
評論(0) 編輯 收藏