posts - 30,  comments - 85,  trackbacks - 0

          數(shù)據(jù)分區(qū)消除指的是數(shù)據(jù)庫服務器根據(jù)查詢謂詞確定只需要訪問表的一部分數(shù)據(jù)分區(qū)就可以實現(xiàn)查詢的能力。當對分區(qū)表運行決策支持查詢時,數(shù)據(jù)分區(qū)消除可以提供特定好處。

          分區(qū)表使用了數(shù)據(jù)組織方案,即,表數(shù)據(jù)根據(jù)該表中一個或多個表分區(qū)鍵列中的值分布到多個存儲對象(稱為數(shù)據(jù)分區(qū)或范圍)中。根據(jù) CREATE TABLE 語句的 PARTITION BY 子句中指定的內容,給定表的數(shù)據(jù)被劃分到多個存儲對象中。這些存儲對象可以在不同的表空間中,也可以在相同表空間中。

          以下示例演示了數(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ù)庫服務器確定只需要訪問表空間 4(ts4)中的一個數(shù)據(jù)分區(qū)就可以解決此查詢。

          圖 101. 分區(qū)表上數(shù)據(jù)分區(qū)消除所產(chǎn)生的性能方面的好處
          數(shù)據(jù)庫服務器確定只需要訪問一部分數(shù)據(jù)分區(qū)就可以實現(xiàn)查詢。

          圖 102 中顯示的另一個數(shù)據(jù)分區(qū)消除示例是索引掃描,它涉及兩個索引并根據(jù)以下方案進行掃描:

          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ū)(索引“與”(AND))和使用表分區(qū)(數(shù)據(jù)分區(qū)消除)時的優(yōu)化器決策路徑。

          在不使用表分區(qū)時,一種可能的方案是索引“與”(AND)。索引“與”(AND)執(zhí)行下列任務:

          • 讀取每個索引中的所有相關索引條目
          • 保存兩組行標識(RID)
          • 匹配 RID 以確定哪些 RID 同時出現(xiàn)在這兩個索引中
          • 使用 RID 來訪存行

          圖 102 中所示,在使用表分區(qū)的情況下,讀取索引以查找 region 和 sale_date 的匹配項,從而允許快速檢索匹配行。

          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>
          
          多列支持

          在使用多個列作為表分區(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ū)就可以解決此查詢。

          注:
          在多個列組成表分區(qū)鍵的情況下,只有當擁有組合鍵的前導列上的謂詞時才能實現(xiàn)數(shù)據(jù)分區(qū)消除,因為用于表分區(qū)鍵的非前導列不是獨立的。

           

          多范圍支持

          可以使用多個范圍在數(shù)據(jù)分區(qū)上實現(xiàn)數(shù)據(jù)分區(qū)消除(即,一起執(zhí)行“或”(OR)運算)。通過使用上一個示例中創(chuàng)建的表,執(zhí)行下列查詢:

          	SELECT * FROM sales
          WHERE (year = 2001 AND month <= 3) OR (year = 2002 and month >= 10)

          數(shù)據(jù)庫服務器只訪問 2001 年的第一季度和 2002 年的最后一個季度的數(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ū)消除。此外,當用來生成列的表達式是單調的時,數(shù)據(jù)庫服務器會將源列上的謂詞轉換為生成列上的謂詞,從而在生成列上啟用數(shù)據(jù)分區(qū)消除。

          例如,如果具有以下查詢:

          	SELECT * FROM sales WHERE a > 35

          數(shù)據(jù)庫服務器根據(jù)(a > 35)在 b(b > 7)上生成額外謂詞,從而允許數(shù)據(jù)分區(qū)消除。

          連接謂詞

          如果將連接謂詞下推到表訪問級別,則也可以在數(shù)據(jù)分區(qū)消除中使用連接謂詞。連接謂詞僅在嵌套循環(huán)連接(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

          在此示例中,由于不知道連接的外值,因此不能確定將在編譯時訪問的額外數(shù)據(jù)分區(qū)。在這種情況下,以及在使用主變量或參數(shù)標記的情況下,當綁定必需的值時,就會發(fā)生數(shù)據(jù)分區(qū)消除。

          在運行時,當 T1 是 NLJN 的內部表時,會根據(jù) T2.A 的每個外值的謂詞自動進行數(shù)據(jù)分區(qū)消除。在運行時,對外值 T2.A = 3 應用謂詞 T1.A = 3 和 T1.B > 15,這樣就限定了訪問的表空間 ts6 和 ts7 中的數(shù)據(jù)分區(qū)

          考慮表 T1 和 T2 中的列 A 具有下列值:

          外部表 T2:列 A 內部表 T1:列 A 內部表 T1:列 B 內部表 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)連接(假定對內部表進行表掃描),數(shù)據(jù)庫管理器執(zhí)行下列步驟:

          1. 讀取 T2 中的第一行。A 的值是 2。
          2. 在連接謂詞 T1.A = T2.A 中將 T2.A 值(它是 2)綁定到列 T2.A。該謂詞就變成 T1.A = 2。
          3. 使用謂詞 T1.A = 2 和 T1.B > 15 應用數(shù)據(jù)分區(qū)消除。這將限定表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū)
          4. 在應用 T1.A = 2 和 T1.B > 15 之后,掃描表 T1 的表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū),直到找到一行為止。找到的第一個合格行是 T1 的行 3。
          5. 連接匹配的行。
          6. 掃描表 T1 的表空間 ts4 和 ts5 中的數(shù)據(jù)分區(qū),直到找到下一個匹配項(T1.A = 2 和 T1.B > 15)為止。再也找不到其他行。
          7. 對 T2 的下一行(將 A 的值替換為 3)重復步驟 1 至 6,直到用完 T2 中的所有行為止。
          posted on 2007-08-21 10:44 安文豪 閱讀(1207) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(6)

          隨筆檔案(28)

          文章分類(3)

          文章檔案(4)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 86800
          • 排名 - 670

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 潞城市| 和田县| 五大连池市| 剑阁县| 黔西县| 漳州市| 南平市| 屯昌县| 通道| 多伦县| 罗甸县| 南投市| 雅江县| 和平区| 三门峡市| 夹江县| 炎陵县| 洱源县| 双桥区| 都江堰市| 五台县| 洪洞县| 皮山县| 唐河县| 三亚市| 武城县| 苍梧县| 广州市| 莱州市| 乌兰浩特市| 三亚市| 读书| 长武县| 玛曲县| 滨海县| 云南省| 灵丘县| 云霄县| 安顺市| 九寨沟县| 汉沽区|