小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

DB2 最佳實(shí)踐: 物理數(shù)據(jù)庫(kù)設(shè)計(jì)最佳實(shí)踐,第 2 部分

 dazheng 2009-12-31

2009 年 9 月 24 日

物 理數(shù)據(jù)庫(kù)設(shè)計(jì)是影響數(shù)據(jù)庫(kù)性能的一個(gè)最重要的因素。物理數(shù)據(jù)庫(kù)設(shè)計(jì)涵蓋了所有和數(shù)據(jù)庫(kù)物理結(jié)構(gòu)相關(guān)的設(shè)計(jì)功能,比如表規(guī)范化和反規(guī)范化、索引、物化視圖、 數(shù)據(jù)集群、多維數(shù)據(jù)集群、表(range)分區(qū)還有數(shù)據(jù)庫(kù)(hash)分區(qū)。本文從MDC、數(shù)據(jù)庫(kù)分區(qū)、視圖以及后設(shè)計(jì)工具方面闡述物理數(shù)據(jù)庫(kù)設(shè)計(jì)最佳實(shí) 踐。

數(shù)據(jù)集群和 MDC 最佳實(shí)踐

 

MDC 是一個(gè)同時(shí)有不止一個(gè)維度數(shù)據(jù)集群的技術(shù)。然而,你也可以對(duì)一個(gè)維度使用 MDC 集群,就像你可以使用一個(gè)集群索引一樣。 MDC 的一個(gè)好處是它能保證數(shù)據(jù)一直處于集群狀態(tài),永遠(yuǎn)不需要執(zhí)行一個(gè)重組操作來(lái)重新建立較高的集群命中率。

而 且,不同于用 CREATE INDEX 語(yǔ)法創(chuàng)建的傳統(tǒng)索引,MDC 是對(duì)表中的每一行建立索引,MDC 通過塊把表中的數(shù)據(jù)編入索引。每個(gè)塊和表所在的表空間中的擴(kuò)展數(shù)據(jù)塊有相同的大小。當(dāng) CREATE INDEX 命令創(chuàng)建索引時(shí),每一行數(shù)據(jù)頁(yè)會(huì)同時(shí)被編入索引,每個(gè) MDC 表索引 BLOCKS 可以包含上千條數(shù)據(jù)。 MDC 索引,也叫 BLOCK INDEX,通常只有 1/1000 大小基于索引的行,而且不光為索引提供了大量的保留存儲(chǔ)空間,同時(shí)也為所有 BLOCK INDEX 操作(索引掃描、索引 ANDing、索引 ORing,等等)提供了非常好的性能。

要理解 MDC,你必須首先理解一些基礎(chǔ)術(shù)語(yǔ):?jiǎn)卧潜砣菁{數(shù)據(jù)的部分,它有一套唯一的維度值 ,是每個(gè)維度切片相交形成的。塊是存儲(chǔ)單元等于一個(gè)擴(kuò)展數(shù)據(jù)塊(一個(gè)或多個(gè)頁(yè)面),塊被用來(lái)存儲(chǔ)一個(gè)單元。

MDC 表的塊索引

如 上面所述,除了它們指向的是塊而不是記錄,塊索引在結(jié)構(gòu)上和普通索引是一樣的。塊索引比普通索引要更小,因?yàn)閴K大小是一個(gè)頁(yè)面中的平均記錄數(shù)的數(shù)倍。如圖 4 中所示,同每一行每一個(gè)單獨(dú)的輸入相比,在一個(gè)塊索引中每塊都有一個(gè)單獨(dú)的索引。結(jié)果就是,一個(gè)塊索引顯著降低了磁盤使用率并明顯加快了數(shù)據(jù)訪問的速度。


圖 4. 行索引和塊索引有什么不同
圖 4. 行索引和塊索引有什么不同

圖 5 中顯示的 MDC 表示一個(gè)物理組織,比如所有記錄有相同的“ Region ”以及“ Year ”值都同每個(gè)塊或擴(kuò)展數(shù)據(jù)塊中連在一起。


圖 5. 一個(gè)多維集群表
圖 5. 一個(gè)多維集群表

甚至一個(gè)只定義一個(gè)維度的 MDC 表也可以從這些 MDC 屬性中獲益,而且可以替換一個(gè)有集群索引的普通表。這個(gè)決定應(yīng)該基于很多因素,包括組成工作負(fù)載的查詢以及表中數(shù)據(jù)的性質(zhì)和分布。

在插入操作過程中自動(dòng)維護(hù)集群

在 MDC 表中自動(dòng)維護(hù)數(shù)據(jù)集群確保了使用復(fù)合塊索引。這些索引被用來(lái)根據(jù)在 INSERTS 操作過程中的表的維度來(lái)動(dòng)態(tài)管理和維護(hù)數(shù)據(jù)庫(kù)的物理集群。當(dāng)一個(gè)插入發(fā)生了,合成塊索引將會(huì)在與被插入記錄的維度值相應(yīng)的邏輯單元中被探測(cè)到。

如圖 6 所示,在索引中的邏輯單元的鍵值,它的塊 ID(BIDs)的列表完整的給出了表中有這個(gè)本地單元維度值的塊列表。這限制了給插入記錄搜索可用空間的表的擴(kuò)展數(shù)據(jù)塊的數(shù)目。


圖 6. 在‘ YearAndMonth ’,‘ Region ’上的復(fù)合塊索引
圖 6. 在‘ yearandmonth ’,‘ region ’上的復(fù)合塊索引

因 為集群是自動(dòng)維護(hù)的,所以對(duì) MDC 表來(lái)說(shuō)不需要重組操作來(lái)重新集群數(shù)據(jù)。然而,重組仍然被用來(lái)釋放空間。例如,如果單元有很多分散的塊,數(shù)據(jù)很少能夠匹配到,或者,如果表有很多指針溢出, 這個(gè)表的重組操作將壓縮屬于邏輯單元的記錄到最少的塊中,用時(shí)也刪除指針溢出對(duì)。

使用 MDC 的益處

MDC 的意義非常深遠(yuǎn)。在某些情況下它能將復(fù)雜查詢的性能提高 10 倍以上,同時(shí)你還可以用它轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)。還有下面顯示的其他好處:

  • MDCs 是多維的。例如,數(shù)據(jù)可以根據(jù) DATE 和 LOCATION 維度完美集群;單元和范圍在新數(shù)據(jù)插入的時(shí)候會(huì)被自動(dòng)創(chuàng)建。
  • MDCs 能和普通基于 RID 的索引、范圍分區(qū)和 MQTs 聯(lián)合使用。
  • MDCs 和內(nèi)部查詢并行性、DPF(不共享)并行性、LOAD、BACKUP 和 REORG 操作同時(shí)使用。
  • MDC 維度,和范圍分區(qū)表不同,它是動(dòng)態(tài)的;它會(huì)在表中自動(dòng)創(chuàng)建新的單元,因?yàn)樾聠卧潜硎就ㄟ^ SQL 操作(包括 JDBC、CLI,等等)或通過使用工具操作(比如 LOAD 和 IMPORT)插入的新的唯一數(shù)據(jù)。
  • MDCs 維護(hù)集群,而且正因?yàn)檫@樣就不需要 REORGs 來(lái)維護(hù)集群命中率了。

下面的例子顯示了如何定義一個(gè) MDC 表:

CREATE TABLE T1 (c1 DATE, c2 INT, c3 INT, c4 DOUBLE,
                    c5 INT generated always as (INT(C1)/100) )
                    ORGANIZE BY DIMENSIONS (c5, c3)
                    

ORGANIZE By 子句定義了集群的維度。這個(gè)表同時(shí)在 C5 和 C3 上被集群。 C1 是 coarsified C5,它包含很少的不同值(天減少為月)。

注意:由 coarsified 產(chǎn)生的 columns(s) 被使用在 MDC 塊索引中,以提高單元級(jí)別的數(shù)據(jù)清除。

MDC 設(shè)計(jì)的一個(gè)關(guān)鍵是謹(jǐn)慎選擇集群的維度。如果你選擇的集群維度產(chǎn)生太多的單元,存儲(chǔ)的成本會(huì)顯著的增加。知道其中的原因非常重要。在一個(gè) MDC 表中,每個(gè)單元都會(huì)根據(jù)需要的存儲(chǔ)塊來(lái)分配。存儲(chǔ)塊是設(shè)計(jì)為和表所在表空間的擴(kuò)展數(shù)據(jù)塊的大小相等。如果一個(gè)單元沒有數(shù)據(jù),那么存儲(chǔ)塊的數(shù)據(jù)是 0 。然而,在一個(gè)單元中存儲(chǔ)了若干記錄的典型表中會(huì)造成給單元分配一個(gè)或多個(gè)存儲(chǔ)塊。對(duì)每個(gè)有數(shù)據(jù)的單元都會(huì)有一批通常只包含了被部分填充數(shù)據(jù)塊。因此,在 每個(gè)單元(不是數(shù)據(jù)塊)中造成浪費(fèi)和存儲(chǔ)塊的大小成比例。新數(shù)據(jù)庫(kù)只有個(gè)在前面的數(shù)據(jù)塊被填滿(或快滿)后被創(chuàng)建。如果行被刪除,數(shù)據(jù)庫(kù)管理器會(huì)嘗試盡可 能多的重用空間。

存儲(chǔ)塊被設(shè)計(jì)為同這個(gè)表所在表空間的擴(kuò)展數(shù)據(jù)塊大小相等。如果這個(gè)表的單元數(shù)目非常大,存儲(chǔ)的浪費(fèi)也會(huì)很大。如 果 MDC 很差而且產(chǎn)生了大量的單元,表的存儲(chǔ)需求會(huì)非常顯著的增加,而且 MDC 的性能也會(huì)受損。然而,設(shè)計(jì)的 MDC 表只會(huì)比非 MDC 表大一點(diǎn),而且在集群和數(shù)據(jù)轉(zhuǎn)入轉(zhuǎn)出上提供了較大的好處(將在后面討論)

圖 7 顯示存儲(chǔ)塊和單元分配。如圖所示,每個(gè)單元都包含了一批存儲(chǔ)塊。絕大多數(shù)塊被數(shù)據(jù)填充,不過對(duì)于每個(gè)單元的最后一個(gè)塊,卻是或多或少被部分填充的。


圖 7. MDC 單元存儲(chǔ)
圖 7. mdc 單元存儲(chǔ)

如果你有樣本數(shù)據(jù)或具體數(shù)據(jù),你就可以使用 SQL 來(lái)為所有可能的 MDC 設(shè)計(jì)度量 MDC 需要的單元數(shù)目,如下所示:

SELECT COUNT(*) FROM (SELECT DISTINCT COL1, COL2, COL3 FROM MY_FAV_TABLE) AS NUM_DISTINCT;

對(duì)一個(gè) 3 維的 MDC 表來(lái)說(shuō),COL1、COL2 和 COL3 是 MDC 的維度。結(jié)果數(shù)乘以表的擴(kuò)展數(shù)據(jù)塊大小將得出一個(gè)在表被轉(zhuǎn)換為 MDC 過程中擴(kuò)展數(shù)據(jù)塊增長(zhǎng)(不是大?。┑纳舷?。

MDC 的其他核心價(jià)值是 DB2 數(shù)據(jù)庫(kù)管理器在表的 MDC 維度上自動(dòng)為 MDC 表創(chuàng)建索引。這些特殊的索引對(duì)塊而非行建立索引,這是可行的。因?yàn)樵? MDC 表中數(shù)據(jù)會(huì)一直保持集群,因此在相同塊中的所有的行同樣確保有相同的鍵值。這是由于在 MDC 中數(shù)據(jù)是對(duì)塊進(jìn)行索引而非記錄,所以塊索引通常是傳統(tǒng)基于行的索引的 1/1000 大小。結(jié)果就是在相關(guān)查詢運(yùn)行時(shí)的性能好處,并把 INSERT、UPDATE 和 DELETE 操作的開銷減到了最少。

MDC 提供的功能方便了數(shù)據(jù)的轉(zhuǎn)入和轉(zhuǎn)出。索引條目指向一個(gè)塊而不是一行,塊索引又比典型的(rowID)RID 索引要小很多。因此,當(dāng) MDC 在轉(zhuǎn)入處理時(shí)只有很少的塊索引 I/O,這是因?yàn)閴K索引只在塊被寫滿的時(shí)候被更新一次(而不是每一行插入)。由于 MDC 重用已經(jīng)存在的空塊不需要分頁(yè),所以插入也很快。插入時(shí)加的鎖也少了,因?yàn)樗麄儼l(fā)生在一個(gè)塊級(jí)別而不是行級(jí)別。表在轉(zhuǎn)入和轉(zhuǎn)出后不需要 REORG 數(shù)據(jù)。

MDC 存儲(chǔ)場(chǎng)景

想要為一個(gè)傳統(tǒng)事實(shí)表基于 Date、Product Name 和 Region 創(chuàng)建一個(gè) MDC 。這里有一些在創(chuàng)建 MDC 時(shí)需要考慮的變量:

  • 一年有 365 天。
  • XYZ 公司有 100,000 個(gè)產(chǎn)品。
  • XYZ 公司有 10 個(gè)區(qū)域。

開始創(chuàng)建 MDC

如果 MDC 直接創(chuàng)建在 Date, Product 和 Region 列上,每天將會(huì)產(chǎn)生 1,000,000 個(gè)新的單元(1 x 100,000 x 10),而每年則會(huì)產(chǎn)生 365,000,000 個(gè)單元。

如果區(qū)域中事務(wù)非常少,這將會(huì)有很多分散甚至是空的頁(yè)面。這會(huì)導(dǎo)致大量沒有必要的空間分配數(shù)量巨大的單元(頁(yè)面)用來(lái)容納塊數(shù)據(jù)。這非常不好。

開始 MDC 的創(chuàng)建

使用函數(shù)來(lái) coarsify 和限制 MDC 的基數(shù),例如:

  • 如果你在 Date 上使用月份函數(shù),那么每年你會(huì)有 12 條記錄。
  • 如果你截取 Production Name 來(lái)挑出產(chǎn)品名稱的第一個(gè)字母,你就會(huì)有 26 條可能的結(jié)果。
  • 保留 Region 的 10 個(gè)結(jié)果。

使用這個(gè)場(chǎng)景中的建議,MDC 將會(huì)每年產(chǎn)生 12*26*10 = 3210 個(gè)單元或每天 8-9 個(gè)單元。這會(huì)消除很多頁(yè)面沒有數(shù)據(jù)的情況,并對(duì) MDC 提供合理的基數(shù)來(lái)獲得性能的好處。

MDC 運(yùn)行時(shí)的開銷 / 收益

MDC 是設(shè)計(jì)來(lái)為查詢和許多刪除場(chǎng)景提供極大性能好處。雖然如此,在對(duì)使用了集群索引的集群表提供顯著的性能好處的同時(shí),MDC 表這么做所帶來(lái)的開銷還是超過了非集群表。 MDC 和非集群表相比第一個(gè)開銷是:

  • 在一個(gè)非集群表上的 INSERT 操作,不需要通過索引訪問來(lái)判斷記錄被存放在磁盤的什么位置。相比之下在 MDC 表上,在選擇哪個(gè)塊中有空間存放插入的記錄之前,需要通過訪問 MDC 復(fù)合塊索引來(lái)判斷記錄屬于哪個(gè)單元。
  • 如果 MDC 表包括一個(gè)產(chǎn)生的列來(lái) coarsify 其中的一個(gè)維度,每個(gè) INSERT 將引起很少的處理開銷來(lái)為這一列計(jì)算生成值 , 就像 DB2 中的所有生成列一樣被物化,也就是被計(jì)算出來(lái)然后填充在記錄中。

然而,當(dāng)和使用集群索引而集群起來(lái)的表相比較的話,MDC 有著顯著的性能優(yōu)勢(shì):

  • 與 一個(gè)集群索引相比,索引維護(hù)可以顯著的減少 INSERTs,因?yàn)?DB2 數(shù)據(jù)庫(kù)管理器僅只有在第一個(gè)鍵值添加到塊中時(shí)的時(shí)候才更新塊索引——不像一個(gè) RID 索引,每一行插入表中都需要對(duì)索引進(jìn)行更新。也就是說(shuō),如果每塊有 1000 條記錄,索引更新率就是 RID 索引更新率的 1/1000 。
  • 索引更新也非常廉價(jià),因?yàn)樗饕《乙虼怂栽跇渲杏懈俚膶?。?B+ 樹中有更少的層次,則意味著需要更少的處理來(lái)為索引插入判斷目標(biāo)的葉子節(jié)點(diǎn)。

無(wú) 論使用集群索引還是用 MDC 來(lái)進(jìn)行索引,在這兩種情況下 DB2 數(shù)據(jù)庫(kù)管理器都將在 INSERT 到目標(biāo)記錄的位置時(shí)訪問索引(塊索引的集群索引),并在 INSERT 過程中判斷記錄的目標(biāo)位置。再?gòu)?qiáng)調(diào)一下這個(gè)索引非常小,而且樹的高度通常很短,因此搜索速度非常快。

判斷什么時(shí)候使用 MDC,什么時(shí)候使用集群索引

MDC 的價(jià)值要比集群索引高很多,因?yàn)樗梢宰詣?dòng)保證集群。根據(jù) coarsification 的需求,MDC 的集群率通??梢赃_(dá)到 93%-100% 之間的某個(gè)值。相比之下,集群索引雖然可以在一開始就接近 100%,但是隨著時(shí)間的推移卻會(huì)變得不集群,因而需要花費(fèi)時(shí)間來(lái)對(duì)數(shù)據(jù)重新集群。一般情況下,使用 MDC 在你的數(shù)據(jù)庫(kù)上創(chuàng)建和維護(hù)數(shù)據(jù)集群,除非:

  • MDC 需要 coarsification,而且你不能將一個(gè)生成列添加到你的表中。
  • 你不能也不需要在表增長(zhǎng)過程中將表的結(jié)果生成 MDC 版本。良好設(shè)計(jì)的 MDC 表一般比非 MDC 表大 2-15% 。
  • 你會(huì)發(fā)現(xiàn),由于 coarsification 的原因,MDC 集群將提供稍小的集群率(例如,93%)。而使用集群索引的話,為了提高集群率你需要周期性的執(zhí)行 REORG 來(lái)達(dá)到這個(gè)比率。

使用下面的 MDC 設(shè)計(jì)的最佳實(shí)踐:

  • 從找出等于、不等、范圍和排序謂詞使用的列開始,請(qǐng)選擇出你的 MDC 候選列。維度必須匹配你的轉(zhuǎn)入范圍才能提高數(shù)據(jù)轉(zhuǎn)入效率。
  • 記住,要爭(zhēng)取密度!為每個(gè)已經(jīng)存在的單元分配一個(gè)擴(kuò)展數(shù)據(jù)塊 – ——不管單元中有多少條記錄。這樣可以通過最優(yōu)的空間利用率來(lái)增強(qiáng) MDC,盡量高密度的填充數(shù)據(jù)塊。
  • 控制表的膨脹。保持盡可能低的單元數(shù)目并限制存儲(chǔ)擴(kuò)展。 5% 到 10% 的增長(zhǎng)對(duì)任何單個(gè)表都是合理的范圍(本文在下面章節(jié)討論 MDC 單元),但是也有例外,甚至也有兩倍于平常的增長(zhǎng),不過很少。

注意:BLOCK 索引與相應(yīng)的表相比非常的小,在大多數(shù)情況下,你可以忽略它們的存儲(chǔ)需求。

  • Coarsify 一些維度來(lái)提高數(shù)據(jù)的密度。使用生成列來(lái) coarsifications 表中基數(shù)非常少的列。例如,基于日期列的一部分 month-of-year 上創(chuàng)建一列,或使用(INT(列名))/100 來(lái)把 DATE 列從 Y-M-D 格式轉(zhuǎn)換成 Y-M 。
    CREATE TABLE Sales
                            (SALES_DATE DATE,
                            REGION CHAR(12),
                            PRODUCT CHAR(30), …
                            MONTH GENERATED ALWAYS AS
                            ((INTEGER(DATE)/100) …
                            ORGANIZE BY (MONTH, REGION, PRODUCT)
                            

    查詢:

    select * from sales
                            where sales_date> ” 2006/03/03 ” and date< “ 2007/01/01 ” ..

    編譯器會(huì)生成附加的謂詞:

    month>=200603 and month<=200701

    為了減少空間浪費(fèi),可以指定一個(gè)更小的表空間擴(kuò)展數(shù)據(jù)塊,這會(huì)減少你的 MDC 塊大小。

  • 不要選擇太多的維度。很少有設(shè)計(jì)能在 MDC 有 3 個(gè)以上的維度卻不產(chǎn)生過多的存儲(chǔ)需求。

    你擁有的維度越多,單元基數(shù)就會(huì)以指數(shù)級(jí)相應(yīng)的增長(zhǎng)。這使得控制表膨脹率 10% 的設(shè)計(jì)目標(biāo)變得幾乎不可能實(shí)現(xiàn)。如果表過度膨脹(例如超過兩倍大?。┎粌H需要更多的存儲(chǔ),同時(shí)也會(huì)因?yàn)椴糠痔畛鋲K的 I/O 增加而使集群失去優(yōu)勢(shì)。

    一個(gè)簡(jiǎn)單的例子:考 慮一個(gè)有三個(gè)維度適合集群的表,每個(gè)有 10,000 唯一值。如果這些列彼此之間沒有相互關(guān)聯(lián),那么對(duì)所有三個(gè)維度的集群就沒有 coarsification,這會(huì)產(chǎn)生 10,000 x 10,000 x 10,000 個(gè)單元,每個(gè)單元有一個(gè)部分填充塊。如果每塊是 1MB,那么這個(gè)設(shè)計(jì)上的疏忽產(chǎn)生的代價(jià)就將是 500,000TB !

  • 考慮只有一個(gè)維度的 MDC 。和傳統(tǒng)單維度集群索引相比,單個(gè)維度的 MDC 仍然有相當(dāng)多的優(yōu)點(diǎn)。有如下理由:
    • 集群是有保證的。
    • MDC 表中的索引是用block創(chuàng)建的,而非row。這種索引大小只有傳統(tǒng)基于行的索引的 1/1000 。
    • 用 MDC 轉(zhuǎn)出數(shù)據(jù),提高了 DELETE 性能。 DB2 9.5 中在 MDC 上的 RID 索引更新是異步的。
    • MDC 可以很方便的轉(zhuǎn)入數(shù)據(jù)。
    • 使 用單維 MDC(如果需要可以 coarsification)強(qiáng)制進(jìn)行集群來(lái)替代集群索引。集群索引需要付出很大的努力(不能保證集群質(zhì)量)來(lái)集群數(shù)據(jù),而且隨著時(shí)間的推移,數(shù)據(jù)將變 得不再集群。與之相比,MDC 保證了數(shù)據(jù)集群性,避免了重組數(shù)據(jù)的需求(見上面“ MDC Scenario ”章節(jié)中的 coarsification)。
  • 準(zhǔn)備修補(bǔ)(在一個(gè)測(cè)試數(shù)據(jù)庫(kù)上)。在尋找一個(gè)好的 MDC 設(shè)計(jì)過程中,可能需要嘗試也可能會(huì)失敗。可以使用帶有– m C 選項(xiàng)(C 是集群搜索)的 DB2 設(shè)計(jì)顧問程序。也可以使用 db2mdcsizer 實(shí)用工具,這在某個(gè) DB2 產(chǎn)品版本的 AlphaWorks 中提供。 MDC 的修改不會(huì)影響你的應(yīng)用程序編程。
  • 對(duì)一個(gè)有代表性的工作負(fù)載使用 DB2 設(shè)計(jì)顧問程序的 MDC 選擇能力來(lái)為現(xiàn)有表找出恰當(dāng)?shù)?MDC 維度。




回頁(yè)首


數(shù)據(jù)庫(kù)分區(qū)(不共享 hash 分區(qū))的最佳實(shí)踐

數(shù)據(jù)庫(kù)分區(qū)是一個(gè)在數(shù)據(jù)庫(kù)中跨多個(gè)彼此合作的實(shí)例以建立單個(gè)大型數(shù)據(jù)庫(kù)服務(wù)器的水平分布記錄的技術(shù)。這些實(shí)例可以位于一個(gè)服務(wù)器中、跨多個(gè)物理機(jī)器、或它們的組合。在 DB2 產(chǎn)品中,這個(gè)叫數(shù)據(jù)庫(kù)分區(qū)功能(DPF)。

數(shù) 據(jù)庫(kù)分區(qū)允許 DB2 數(shù)據(jù)庫(kù)管理器擴(kuò)充到上百個(gè)實(shí)例參與的大型數(shù)據(jù)庫(kù)系統(tǒng)。這個(gè)設(shè)計(jì)的可伸縮性能使很多復(fù)雜查詢的工作負(fù)載達(dá)到線性增長(zhǎng)。這樣,因?yàn)閿?shù)據(jù)庫(kù)分區(qū)接近線性的擴(kuò)展特 征以及數(shù)據(jù)規(guī)模能達(dá)到數(shù)百 T 以及上百個(gè) CPUs,數(shù)據(jù)庫(kù)分區(qū)在數(shù)據(jù)倉(cāng)庫(kù)和 BI 工作負(fù)載下變得非常流行。由于每個(gè)事物都會(huì)產(chǎn)生實(shí)例內(nèi)部的通訊,而這即使很少卻也能嚴(yán)重影響在 OLTP 工作負(fù)載中常見的短期執(zhí)行事務(wù)類型,因此這個(gè)架構(gòu)在 OLTP 處理上用的較少。

不共享 hash 分區(qū)是把記錄 hash 分布到邏輯數(shù)據(jù)分區(qū)上。 Hash 分布的主要的設(shè)計(jì)目的是確保數(shù)據(jù)均勻分布到所有邏輯節(jié)點(diǎn)(因?yàn)榉秶謪^(qū)容易發(fā)生數(shù)據(jù)傾斜)。這些分區(qū)可能存在于一個(gè)服務(wù)器中或者分布到一批物理機(jī)器上,如圖 9 所示:


圖 9. 表上的 hash 分區(qū)
圖 9. 表上的 hash 分區(qū)

不 共享數(shù)據(jù)庫(kù)的擴(kuò)展性已經(jīng)在大多數(shù)查詢工作負(fù)載接近于線性的擴(kuò)展上得到了證明。同樣,模塊化的設(shè)計(jì)讓使它的存儲(chǔ)壓力、工作壓力或它們兩個(gè)也都線性增長(zhǎng)。結(jié)果 就是在過去十年中不共享結(jié)構(gòu)在數(shù)據(jù)倉(cāng)上的統(tǒng)治地位。數(shù)據(jù)庫(kù)分區(qū)可以在不影響現(xiàn)有應(yīng)用代碼的情況下使用,而且對(duì)它們是完全透明的。使用 redistribution 實(shí)用工具,可以在線更改分區(qū)策略而應(yīng)用代碼不會(huì)受到影響。

最主要的選擇就是決定哪些列用來(lái) hash 分割每個(gè)表,并且這些列包含數(shù)據(jù)庫(kù)分區(qū)鍵值。這有兩個(gè)目標(biāo):

  1. 在各個(gè)分區(qū)間均勻的分布數(shù)據(jù)。這要求選擇那些高基數(shù)值的列為分區(qū)鍵,以確保所有行能均勻的分布到各個(gè)邏輯分區(qū)上。
  2. 把在 join 處理中數(shù)據(jù)庫(kù)分區(qū)之間的數(shù)據(jù)傳輸減少到最小。如果在 WHERE 子句中包含分區(qū)鍵,那么將對(duì)被連接的行的表并置(避免移動(dòng)數(shù)據(jù))。

使用下面的數(shù)據(jù)庫(kù)分區(qū)的最佳實(shí)踐:

  • 選擇用大量值(高基數(shù))作為分區(qū)鍵,以確保表中的行能均勻的分布到各個(gè)分區(qū)。唯一鍵是一個(gè)很好的候選。
  • 為了提高表并置,可以對(duì)一個(gè)經(jīng)常進(jìn)行連接的表使用分區(qū)鍵作為連接列(假如這些列有很高的基數(shù)來(lái)滿足均勻分布行的需求)。
  • 選擇能獲得高基數(shù)并能在分區(qū)鍵中均勻分布行的最小的列數(shù)。減少分區(qū)鍵中的列數(shù)提高了列出現(xiàn)在連接謂詞中的可能性(提高表并置的幾率)。
  • 確保唯一索引是分區(qū)鍵的超集。
  • 對(duì)小表(表大小只有或不到數(shù)據(jù)庫(kù)大小的 3% 或不到最大的表的 5% ,是一個(gè)合理的法則)或經(jīng)常被更新的表,使用復(fù)制 MQTs ,目的是:
    • 提高表并置和減少網(wǎng)絡(luò)間的數(shù)據(jù)移動(dòng)。
    • 有助于在連接中的表并置
  • 允許提前計(jì)算表中的值,從而提高在一個(gè)分區(qū)數(shù)據(jù)庫(kù)環(huán)境中經(jīng)常執(zhí)行連接的性能。

    例如:

    CREATE TABLE R_EMPLOYEE
                            AS (
                            SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME,
                            WORKDEPT
                            FROM EMPLOYEE
                            )
                            DATA INITIALLY DEFERRED REFRESH IMMEDIATE
                            IN REGIONTABLESPACE
                            REPLICATED;

    要更新復(fù)制物化查詢表中的內(nèi)容,可以運(yùn)行下面的語(yǔ)句:

    REFRESH TABLE R_EMPLOYEE;

    注意:在使用 REFRESH 語(yǔ)句后,你應(yīng)該在復(fù)制表中運(yùn)行你在其他表中運(yùn)行的 RUNSTATS 語(yǔ)句。

  • 考慮到不同的值和在相應(yīng)實(shí)施表的列中的數(shù)據(jù)傾斜,應(yīng)該把最大的維度和事實(shí)表進(jìn)行并置。
  • 復(fù)制小的維度,這里“ small ”是相對(duì)的,而且是基于安裝的可用存儲(chǔ)。
  • 復(fù)制一個(gè)水平的或者垂直的維度子集:
    • 將主鍵上剩余的所有維度進(jìn)行分區(qū)。
    • 在為了提高表并置而創(chuàng)建了一個(gè)復(fù)制表后,不要忘了收集表和索引的統(tǒng)計(jì)信息(或者使用 DB2 自動(dòng)收集統(tǒng)計(jì)信息功能)。不要忘了在復(fù)制 MQT 表中實(shí)現(xiàn)與你在基礎(chǔ)表中定義相同的索引。
    • 如果他們很小而且很少被更新,就定義復(fù)制 MQTs 為 REFRESH IMMEDIATE 。否則就使用一個(gè)延遲更新策略。
  • 把大型表分布在多個(gè)分區(qū)上。如果小表的記錄不到一百萬(wàn)條,就可以只放在一個(gè)數(shù)據(jù)庫(kù)分區(qū)中。

在設(shè)計(jì)不共享數(shù)據(jù)倉(cāng)庫(kù)分區(qū)時(shí)的其他問題是如何判斷最佳的內(nèi)存、CPUs、總線、存儲(chǔ)能力、存儲(chǔ)帶寬的組合,那么,它們分別需要多少呢?

要解決這個(gè)問題,IBM 提供了 IBM Balanced Warehouse,它基于不共享架構(gòu)的數(shù)據(jù)庫(kù)系統(tǒng)。它是通過成功的客戶運(yùn)行開發(fā)的 IBM 最佳實(shí)踐。

Balanced Warehouse 和 Balanced Configuration Units(BCU)

Balanced Warehouse 又被稱作 Balanced Configuration Units(BCU)的構(gòu)件。這些構(gòu)件是為了性能進(jìn)行預(yù)配置、預(yù)測(cè)試而調(diào)試過的,用以提供一個(gè)理想的數(shù)量和比例的資源。 BCU 結(jié)合了數(shù)據(jù)庫(kù)配置和硬件組成的最佳實(shí)踐,盡可能的簡(jiǎn)化數(shù)據(jù)倉(cāng)庫(kù)的安裝和配置。幾十個(gè)資源率和數(shù)據(jù)庫(kù)配置的最佳實(shí)踐都被整合進(jìn)了 Balanced Warehouse 。

圖 10:顯示了 Balanced Warehouse 在 2007 年和 2008 年提供的多種產(chǎn)品。你可以看到,Balanced Warehouse 現(xiàn)在提供了 3 種產(chǎn)品:C、D 和 E 。這 3 種產(chǎn)品提供了持續(xù)增強(qiáng)能力和可擴(kuò)展性的解決方案。 C 級(jí)別是一個(gè)提供給市場(chǎng)的入門級(jí)別,或可以集成進(jìn)一臺(tái)服務(wù)器中的系統(tǒng)。 D 和 E 級(jí)利用 DB2 數(shù)據(jù)庫(kù)分區(qū)能力,提供了可以擴(kuò)展到相當(dāng)規(guī)模的配置。


圖 10. Balanced Warehouse 的產(chǎn)品,2007-2008
圖 10. balanced warehouse 的產(chǎn)品,2007-2008




回頁(yè)首


表(范圍)分區(qū)的最佳實(shí)踐

表分區(qū) 應(yīng)該被用來(lái)顯著的提高轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)。它允許管理員添加一個(gè)大范圍的數(shù)據(jù)(比如某月新的數(shù)據(jù))到一個(gè)表中 en-masse 而且更重要的是管理員幾乎可以同時(shí)從表或從數(shù)據(jù)庫(kù) en-masse 中刪除數(shù)據(jù)。

DB2 數(shù)據(jù)庫(kù)系統(tǒng)的唯一異步索引清除技術(shù)意味著就算全局索引的數(shù)據(jù)跨多個(gè)范圍分區(qū),也可以從表中分離一個(gè)范圍分區(qū),甚至這個(gè)范圍分區(qū)的相關(guān)索引鍵對(duì)進(jìn)來(lái)的查詢也 變得立即不可見了。這些鍵值會(huì)被后臺(tái)進(jìn)程隨后以對(duì)負(fù)載幾乎可以忽略不計(jì)的影響不動(dòng)聲色的刪除。數(shù)據(jù)庫(kù)分區(qū)也能通過一個(gè)叫分區(qū)清除的內(nèi)部進(jìn)程帶來(lái)提高查詢性 能的好處,在很多情況下這個(gè)進(jìn)程允許查詢編譯器選擇改良過的查詢計(jì)劃,這是表分區(qū)的第二個(gè)好處。

表分區(qū)也允許你把一個(gè)表分成多個(gè)范圍,存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)分區(qū)里的一個(gè)或多個(gè)物理對(duì)象中。表分區(qū)的目標(biāo)是對(duì)數(shù)據(jù)進(jìn)行邏輯重組,使優(yōu)化數(shù)據(jù)訪問和轉(zhuǎn)出數(shù)據(jù)更容易。這個(gè)表的分割引用程序是透明的,而且因此可以在應(yīng)用程序開發(fā)周期的任何時(shí)候進(jìn)行。

更多關(guān)于表分區(qū)的信息見文章“最佳實(shí)踐:數(shù)據(jù)生命周期管理”。

表分區(qū)包括下列其他屬性和功能:

  • 每個(gè)范圍可以在不同的表空間中。
  • 范圍可以單獨(dú)掃描。
  • 某些 BI 風(fēng)格的查詢性能通過表分區(qū)得到了提高。
  • 新的 ALTER ATTACH/DETACH 語(yǔ)句方便了轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)。
    • 新的 ATTACH 轉(zhuǎn)入選項(xiàng)
    • 新的 DETACH 轉(zhuǎn)出選項(xiàng)
  • SET INTEGRITY 現(xiàn)在可以在線進(jìn)行了(允許對(duì)老數(shù)據(jù)進(jìn)行讀 / 寫訪問)。
  • 在新的范圍中,對(duì)在 ATTACH+SET INTEGRITY 操作使用 ADD 加 LOAD 操作。

下面的例子顯示了如何定義一個(gè)分區(qū)表:

CREATE TABLE SALES(SALE_DATE DATE, CUSTOMER INT, … )
                    PARTITION BY RANGE(SALE_DATE)
                    (STARTING ‘ 1/1/2006 ’ ENDING ‘ 3/31/2008 ’ ,
                    STARTING ‘ 4/1/2006 ’ ENDING ‘ 6/30/2008,
                    STARTING ‘ 7/1/2006 ’ ENDING ‘ 9/30/2008 ’ ,
                    STARTING ‘ 10/1/2006 ’ ENDING ’ 12/31/2012 ’ );

這個(gè)語(yǔ)句結(jié)果會(huì)創(chuàng)建 4 個(gè)表對(duì)象,每個(gè)都存儲(chǔ)一個(gè)范圍的數(shù)據(jù),如圖 8 所示:


圖 8. 數(shù)據(jù)范圍表分區(qū)
圖 8. 數(shù)據(jù)范圍表分區(qū)

使用下列表分區(qū)的最佳實(shí)踐:

  • 使用表(范圍)分區(qū)將范圍數(shù)據(jù)快速刪除(轉(zhuǎn)出)。匹配范圍分區(qū)的周期來(lái)轉(zhuǎn)入和轉(zhuǎn)出范圍。例如,如果你需要根據(jù)月份轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù),那么使用月份進(jìn)行范圍分區(qū)是一個(gè)合理的策略。
  • 在 DATE 列上的分區(qū)。轉(zhuǎn)入和轉(zhuǎn)出場(chǎng)景幾乎總是基于時(shí)間的。改進(jìn)過的查詢執(zhí)行計(jì)劃(QEP)選擇使用分區(qū)清除 以及那些機(jī)會(huì)的大部分也都基于數(shù)據(jù)謂詞。
  • 限制范圍的個(gè)數(shù)。不要忘記每個(gè)范圍都是至少有兩個(gè)擴(kuò)展數(shù)據(jù)塊的表對(duì)象。要避免設(shè)計(jì)過多的分區(qū)數(shù)。調(diào)整的規(guī)則是每個(gè)范圍有最少 50MB 的數(shù)據(jù)(最好每個(gè)范圍有幾 G 數(shù)據(jù))。確保范圍大小和你通常轉(zhuǎn)出數(shù)據(jù)的大小一致。
  • 添加一個(gè)新的范圍,可使用 ADD 加 LOAD 操作,這通常比 ATTACH+SET INTEGRITY 操作更好,因?yàn)槌欠秶苄。駝t后者的索引維護(hù)日志會(huì)非常大。
    • LOAD 實(shí)用工具增量維護(hù)索引,并對(duì)一個(gè)事件只寫一個(gè)日志記錄,而忽略有多少行被插入到表中。
  • 考慮把不同的表分區(qū)放到不同的表空間中,可以方便備份和恢復(fù)。表分區(qū)可以通過表空間來(lái)備份和恢復(fù)。
  • 避免全局索引,因?yàn)檫@可能會(huì)很大,它應(yīng)該存放在它們自己?jiǎn)为?dú)的表空間中。
  • 通過讓范圍分區(qū)鍵成為集群索引(非 MDC)的引導(dǎo)鍵來(lái)確保并保持?jǐn)?shù)據(jù)集群。如果你的集群索引沒有把分區(qū)鍵放在前面,那么數(shù)據(jù)將不會(huì)被正確的集群。例如,
    PARTITION BY RANGE (Month, Region)
                            CREATE INDEX … (Month, Region, Department) CLUSTER

  • 使用頁(yè)面級(jí)別的取樣來(lái)減少 RUNSTATS 時(shí)間。一個(gè) 10-20% 的樣本率,提供了良好質(zhì)量的統(tǒng)計(jì)信息以及主要的性能得到了提高。




回頁(yè)首


UNION ALL 視圖(UAVs)分區(qū)的最佳實(shí)踐

DB2 9 表分區(qū)之前版本的分區(qū)能力,應(yīng)用程序經(jīng)常需要按范圍對(duì)數(shù)據(jù)進(jìn)行分區(qū)。通過對(duì)每個(gè)范圍創(chuàng)建有相應(yīng)約束的表,DBAs 可以通過對(duì)所有這些表創(chuàng)建一個(gè) UNION ALL 視圖提供一個(gè)單獨(dú)的系統(tǒng)視圖。例如:

Create Table TestQ1 (Col 1 date)
                    Alter Table TestQ1
                    add constraint q1_chk
                    (month(dt) in (1,2,3)

對(duì)每個(gè)季度重復(fù)表創(chuàng)建 / 約束

Create View Test as
                    Select * from TestQ1
                    Union
                    Select * from TestQ2

然而,表分區(qū)為編譯器和優(yōu)化器提供了一個(gè)對(duì)表的單獨(dú)的視圖。和 UAV 相比,這允對(duì)不同的范圍使用許更多的侵略性謂詞,而且分區(qū)數(shù)據(jù)有更多的一致性模型。在大多數(shù)數(shù)據(jù)庫(kù)中,表分區(qū)現(xiàn)在是實(shí)現(xiàn)基于范圍的分區(qū)的首選方法。下面將討論一些例外。

UNION ALL 設(shè)計(jì)方法的優(yōu)勢(shì)是:

實(shí)用工具能在只包含一個(gè)范圍的表中執(zhí)行。最主要的考慮是:

復(fù)制,在某個(gè)確定范圍需要復(fù)制而其他范圍不需要復(fù)制時(shí),使用 UNION ALL 視圖可以得到壓縮的好處(在 UAV 中的歷史表可以被壓縮)。

UNION ALL 視圖允許設(shè)計(jì)者存儲(chǔ)非壓縮數(shù)據(jù)到需要復(fù)制對(duì)象中,同時(shí)歷史數(shù)據(jù)可以存儲(chǔ)在其他壓縮對(duì)象中。

聯(lián)邦向終端用戶提供了一個(gè)聯(lián)邦數(shù)據(jù)(存儲(chǔ)在多個(gè) IBM 或非 IBM 數(shù)據(jù)庫(kù)中)視圖。

對(duì)于 RORG,如果范圍經(jīng)常發(fā)生改變,就需要對(duì)范圍進(jìn)行重新集群或壓縮。

  • 大量使用的范圍,可以分離到有額外索引或 MQTs 單獨(dú)的表容器中,以以優(yōu)化數(shù)據(jù)訪問。
  • 這被用來(lái)減少 REORG 的粒度。

比起 UNION ALL 分區(qū)方法,表分區(qū)具有下列優(yōu)勢(shì):

  • 準(zhǔn)備時(shí)間更短(一個(gè)表,而不是一個(gè)視圖中的多個(gè)表)。
  • 管理更簡(jiǎn)單(一個(gè)表,而不是多個(gè)表)。
  • 在轉(zhuǎn)入和轉(zhuǎn)出范圍時(shí),更少編目鎖。
  • 支持跨所有范圍的唯一索引。
  • 可以更好的處理復(fù)雜查詢。
  • 更簡(jiǎn)單的 EXPLAINs(使用 explain 工具)。

把 UNION ALL 視圖遷移為表分區(qū)

可以用以下步驟來(lái)把 UNION ALL 視圖遷移到表分區(qū)中,而不需要移動(dòng)數(shù)據(jù)。

  1. 創(chuàng)建一個(gè)分區(qū)表,它有一個(gè)不影響現(xiàn)有數(shù)據(jù)庫(kù)分區(qū)的虛擬分區(qū)。這需要相同的頁(yè)面大小和擴(kuò)展數(shù)據(jù)塊大小。
  2. ALTER ATTACH 視圖中的所有表。
  3. 刪除掉虛擬分區(qū)。
  4. 運(yùn)行完所有 TABLE ATTACH 命令后運(yùn)行 SET INTEGRITY 。為了加速一致性檢查:
    • 刪除所有索引。
    • 在一致性檢查完成后重建索引。

使用下面 UNION ALL 視圖分區(qū)的最佳實(shí)踐:

  • 使用數(shù)據(jù)庫(kù)分區(qū)來(lái)獲得比 UNION ALL 視圖更好的擴(kuò)展性。
  • 遷移 UNION ALL 視圖到表分區(qū)中。新開發(fā)的應(yīng)用程序使用范圍分區(qū),要求實(shí)施表分區(qū)而不是 UNION ALL 視圖,除非你對(duì) UAV 優(yōu)勢(shì)列表中的一種或多種情況有很強(qiáng)的需求。
  • 實(shí)現(xiàn)把 UNION ALL 應(yīng)用程序遷移到表分區(qū),以獲得 DB2 9.5 自動(dòng)字典壓縮提供的深度壓縮的好處。




回頁(yè)首


數(shù)據(jù)庫(kù)分區(qū)、表分區(qū)和 MDC 在同一個(gè)數(shù)據(jù)庫(kù)中的最佳實(shí)踐

數(shù)據(jù)庫(kù)分區(qū)、表分區(qū)和 MDC 能同時(shí)應(yīng)用在一個(gè)設(shè)計(jì)中。

  • 可以應(yīng)用數(shù)據(jù)庫(kù)分區(qū)獲得擴(kuò)展性,并確保在邏輯分區(qū)之間均勻分布數(shù)據(jù)。
  • 表分區(qū)可以方便查詢分區(qū)消除和數(shù)據(jù)轉(zhuǎn)出。
  • MDC 可以用來(lái)提高查詢性能和方便轉(zhuǎn)入數(shù)據(jù)。

對(duì)于部署大型應(yīng)用程序這是一個(gè)最佳實(shí)踐方法。

例如:

CREATE TABLE TestTable (A INT, B INT, C INT, D INT … )
                    IN Tablespace A, Tablespace B, Tablespace C …
                    INDEX IN Tablespace B DISTRIBUTE BY HASH (A) PARTITION BY RANGE (B)
                    (STARTING FROM (100) ENDING (300) EVERY (100)) ORGANIZE BY DIMENSIONS (C,D)

更多信息請(qǐng)查看文章“最佳實(shí)踐:數(shù)據(jù)生命周期管理”。

使用下面的最佳實(shí)踐:

  • 要部署大型應(yīng)用程序,最好在同一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)中實(shí)現(xiàn)數(shù)據(jù)庫(kù)分區(qū)、表分區(qū)和 MDC 。




回頁(yè)首


使用表分區(qū)和 MDC 最佳實(shí)踐來(lái)轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)

設(shè)計(jì)你的分區(qū)策略,以使用表分區(qū)來(lái)作為轉(zhuǎn)出策略,并利用在單個(gè)維度的 MDC 作為你的轉(zhuǎn)入策略。

例如,如果你按日轉(zhuǎn)入,按月轉(zhuǎn)出,在 day 上指定一個(gè) MDC 并以 month 為表分區(qū)鍵(支持計(jì)算值)。

這個(gè)方法就減少了分區(qū)數(shù),并簡(jiǎn)化了 DBA 的管理任務(wù)。它利用了 MDC 轉(zhuǎn)入數(shù)據(jù)的優(yōu)勢(shì)(用塊索引減少索引 I/O 和日志)。

更多信息見文章“最佳實(shí)踐:數(shù)據(jù)生命周期管理”。

對(duì)轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)使用下面的最佳實(shí)踐:

  • 使用表分區(qū)來(lái)轉(zhuǎn)出,并用單個(gè)維度上的 MDC 來(lái)轉(zhuǎn)入。




回頁(yè)首


使用表分區(qū)最佳實(shí)踐來(lái)轉(zhuǎn)入海量數(shù)據(jù)

可以使用表分區(qū)來(lái)為需要轉(zhuǎn)入龐大的數(shù)據(jù)量的應(yīng)用程序加速,這避免了執(zhí)行一致性檢查的需求。

還有一種連接分區(qū)的方法:你也可以 ALTER ADD 一個(gè)空表到一個(gè)表分區(qū)中。在表分區(qū)添加完成后,你可以用 Load 實(shí)用工具來(lái)填充表(允許對(duì)較老數(shù)據(jù)的只讀訪問)或者使用插入(這需要記日志)。

LOAD 可以提供出眾的性能,而且既可以從外部文件裝載,也可以使用 LOAD from cursor 從一個(gè)查詢定義裝載。

對(duì)應(yīng)用程序使用深度壓縮,DB2 9.5 在轉(zhuǎn)入數(shù)據(jù)時(shí)使用這個(gè)技術(shù)非常容易,因?yàn)樗峁┝俗詣?dòng)字典壓縮,從而避免了用 REORG 來(lái)壓縮數(shù)據(jù)的需求。

更多信息見文章“最佳實(shí)踐:數(shù)據(jù)生命周期管理”。

使用下面轉(zhuǎn)入和轉(zhuǎn)出的最佳實(shí)踐:

  • 使用表分區(qū)來(lái)轉(zhuǎn)入海量數(shù)據(jù)。
  • ALTER ADD 一個(gè)空表到一個(gè)表分區(qū),并使用 Load 實(shí)用工具來(lái)填充它。




回頁(yè)首


MQT 最佳實(shí)踐

MQT 表是基于一個(gè)查詢結(jié)果定義的表。 MQT 包含了預(yù)先計(jì)算的結(jié)果。 MQTs 是一個(gè)提高復(fù)雜查詢響應(yīng)時(shí)間的強(qiáng)大的方式,尤其是有下面幾類數(shù)據(jù)操作需求的查詢:

  • 在一個(gè)或多個(gè)維度上聚合數(shù)據(jù)。
  • 在一組表之間連接聚合數(shù)據(jù)。
  • 數(shù)據(jù)來(lái)自于一個(gè)常見的數(shù)據(jù)訪問子集——也就是來(lái)自于“熱”水平或垂直數(shù)據(jù)庫(kù)分區(qū)。
  • 在分區(qū)數(shù)據(jù)庫(kù)環(huán)境中,數(shù)據(jù)是對(duì)一個(gè)表的再分區(qū),或表的一部分。

為了加速查詢性能,MQTs 可以被用在聯(lián)邦數(shù)據(jù)源的別名上,得以在本地保持頻繁訪問數(shù)據(jù)。他們可以通過復(fù)制來(lái)維護(hù)(系統(tǒng)維護(hù)選項(xiàng)不被支持)。在一個(gè)分區(qū)數(shù)據(jù)庫(kù)中,復(fù)制 MQTs 可以用來(lái)減少網(wǎng)絡(luò)流量。

MQT 對(duì)應(yīng)用程序是完全透明的。 MQT 的知識(shí)已經(jīng)被整合進(jìn) SQL 和 XQuery 編譯器中,它們會(huì)判斷是否 MQT 應(yīng)該被用來(lái)響應(yīng)一個(gè)查詢的所有部分。因此,你可以在不改變應(yīng)用程序代碼的情況下,創(chuàng)建和刪除 MQTs,就和你創(chuàng)建和刪除索引而不需要更改應(yīng)用程序一樣。

圖 11 根據(jù) MQTs 的刷新類型總結(jié)了它的特點(diǎn)。在表中,“ Optimization ”表示 DB2 數(shù)據(jù)庫(kù)管理器在運(yùn)行一個(gè)查詢時(shí),會(huì)利用延遲刷新的 MQT,。然而“ No optimization ”顯示 MQT 不會(huì)被使用,因?yàn)樗赡芤呀?jīng)失效;。也就是說(shuō),數(shù)據(jù)庫(kù)管理器不知道 MQT 什么時(shí)候被刷新了。


圖 11. MQT 刷新特點(diǎn)的總結(jié)
圖 11. mqt 刷新特點(diǎn)的總結(jié)

注意:MQTs 會(huì)降低基礎(chǔ)表上的插入性能。

為了幫助問題診斷,DB2 9 解釋工具顯示了為什么一個(gè) MQT 在訪問路徑中不被采用。

使用下列 MQT 設(shè)計(jì)的最佳實(shí)踐:

  • 對(duì)你打算用來(lái)創(chuàng)建 MQT 的查詢語(yǔ)句,使用相同或更高的隔離級(jí)別。為了減少約束,隔離級(jí)別是:RR、RS、CS 和 UR 。
  • 關(guān)注那些使用大量資源的查詢。這些查詢是利用 MQTs 來(lái)提高性能的最好的機(jī)會(huì)。
  • 對(duì) MQTs 數(shù)目,設(shè)置一個(gè)你愿意維持的限制。這么做有兩個(gè)理由:
    • 每個(gè) MQT 都會(huì)使用磁盤存儲(chǔ)空間。
    • 每個(gè) MQT 都會(huì)增加查找最優(yōu) QEP 的復(fù)雜度,延長(zhǎng)查詢編輯時(shí)間。
  • 為 MQTs 判斷一個(gè)磁盤總量限制。通常,不要分配超過一個(gè)數(shù)據(jù)倉(cāng)庫(kù)磁盤總量的 10% - 20% 給 MQT 。
  • 考慮在 MQTs 使用索引,并在索引創(chuàng)建后執(zhí)行 runstats 。嘗試創(chuàng)建一個(gè)可以用于多個(gè)查詢的 MQT 。常常這樣的 MQT 不能完全匹配一個(gè)查詢,而且可能需要索引。
  • 幫助查詢編譯器找到匹配的 MQTs(MQT 的路由非常復(fù)雜)。利用下面的技術(shù)向編譯器提供盡可能多的信息:
    • 保持 MQTs 的統(tǒng)計(jì)信息實(shí)時(shí)更新。
    • 在 MQT 中的外鍵列上,啟用參考完整性(指定非強(qiáng)制性 RI 以避免系統(tǒng)開銷)。確保 FK 列非空。
    • 避免有問題的 MQT 設(shè)計(jì)造成路由困難。盡量避免使用 EXISTS、NOT EXISTS 和 SELECT DISTINCT,除非 MQT 完全匹配一個(gè)查詢,這些謂詞會(huì)使查詢編譯器很難使用 MQT 。




回頁(yè)首


后設(shè)計(jì)工具來(lái)提高現(xiàn)有數(shù)據(jù)庫(kù)設(shè)計(jì)

Explain 工具的最佳實(shí)踐

Explain 工具可以向你顯示是否使用了設(shè)計(jì)功能。例如,它可以向你顯示在 QEP 中是否訪問了索引、是否使用了分區(qū)消除以及是否查詢被路由到了 MQTs 。

考慮圖 12 中 explain 工具顯示的 TPC-H 查詢關(guān)于的 QEP 片段。


圖 12. TPC-H 查詢 20 的 QEP 片段
圖 12. tpc-h 查詢 20 的 qep 片段

QEP 明確的顯示了 PARTSUPP 需要訪問 TPCD.UXPS_PK2KSC 索引和 PARTSUPP 表自己的信息。你如何判斷原因?

查 看 operator(15),你可以看到 FETCH 聚集需要訪問 PARTSUPP 表,因?yàn)樗饕?PS_PARTKEY 和 PS_SUPPKEY 列,卻不包括 PS_AVAILQTY 列。強(qiáng)烈建議把 PS_AVAILQTY 列也加到索引中,這樣你可以避免在輔助方案中訪問 PARTSUPP 表,會(huì)因此提高性能。

圖 13 中顯示的 explain 輸出表明了優(yōu)化器在 QEP 中考慮了那些 MQTs 卻沒有選擇,以及沒有選擇的原因。這個(gè)原因可能是由于成本或 MQT 匹配度不夠。


圖 13. 使用 explain 工具來(lái)理解 MQT 選擇
圖 13. 使用 explain 工具來(lái)理解 mqt 選擇

使用下列 explain 工具的最佳實(shí)踐:

  • 利用 explain 工具來(lái)幫助理解你的設(shè)計(jì)選擇。

DB2 設(shè)計(jì)顧問程序的最佳實(shí)踐

DB2 設(shè)計(jì)顧問程序是 DB2 自主計(jì)算的一個(gè)關(guān)鍵功能。它是一鍵式解決方案:提供一個(gè)工作負(fù)載(由用戶提供或系統(tǒng)提供)以及可選擇的磁盤約束,設(shè)計(jì)顧問程序建議物理數(shù)據(jù)庫(kù)設(shè)計(jì)選項(xiàng),這 些選項(xiàng)設(shè)計(jì)可以優(yōu)化工作負(fù)載。設(shè)計(jì)顧問程序進(jìn)行廣泛的“假設(shè)”分析、數(shù)據(jù)抽樣和關(guān)聯(lián)模式來(lái)探索上千種設(shè)計(jì)排列,這些是人工無(wú)法做到的。

設(shè)計(jì)顧問程序有下列能力:

  • 索引選擇
  • MQT 選擇
  • MDC 選擇
  • 分區(qū)選擇(對(duì)數(shù)據(jù)庫(kù)分區(qū))
  • 業(yè)界領(lǐng)先的工作負(fù)載壓縮

很多客戶反映使用設(shè)計(jì)顧問程序來(lái)動(dòng)態(tài)提高物理數(shù)據(jù)庫(kù)設(shè)計(jì),在整個(gè)生命周期內(nèi)引導(dǎo)一個(gè)查詢或提升整個(gè)工作負(fù)載的性能。當(dāng)然,你不要不經(jīng)過考慮就應(yīng)用來(lái)自設(shè)計(jì)顧問程序的結(jié)果。

圖 14 強(qiáng)調(diào)了設(shè)計(jì)顧問程序的好處。在這個(gè)例子中,一個(gè)決策支持?jǐn)?shù)據(jù)庫(kù)運(yùn)行在 TPC-H 工作負(fù)載上而且為數(shù)據(jù)集創(chuàng)建了合理的索引,也就是說(shuō),一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)設(shè)計(jì)人員設(shè)計(jì)了這一切,并認(rèn)為這已經(jīng)足夠了。然后使用設(shè)計(jì)顧問程序?qū)?shù)據(jù)庫(kù)提出額外 的建議,而應(yīng)用設(shè)計(jì)顧問程序的結(jié)果帶來(lái)了 6.5 倍的性能提高。


圖 14. 來(lái)自于 DB2 設(shè)計(jì)顧問程序的好處
圖 14. 來(lái)自于 db2 設(shè)計(jì)顧問程序的好處

DB2 設(shè)計(jì)顧問程序的 MDC 選擇能力

為了提高工作負(fù)載性能,可以使用設(shè)計(jì)顧問程序 MDC 選擇能力來(lái)獲得 MDC 表維度的推薦值,包括基礎(chǔ)表上的 coarsifications 。雖然在一個(gè)表上可能會(huì)推薦一個(gè)或多個(gè)維度,但是只對(duì)那些只有一列且不是組合列的維度才會(huì)被考慮。

MDC 選擇能力是通過db2advis實(shí)用工具使用 -m <advise type> 標(biāo)記啟用的。建議類型( “ C ”對(duì)應(yīng) MDC 和集群索引、“ I ”對(duì)應(yīng)索引、“ M ”對(duì)應(yīng) MQT 以及“ P ” 對(duì)應(yīng)數(shù)據(jù)庫(kù)分區(qū))可以互相聯(lián)合。

設(shè)計(jì)顧問程序提供的 MDC 建議,總會(huì)提供良好的密度和在表被轉(zhuǎn)換成 MDC 時(shí)會(huì)發(fā)生的表膨脹總量限制。設(shè)計(jì)顧問程序中的分析操作不僅包括塊索引的好處,而且也包括了 MDC 對(duì)插入的影響,以及刪除表維度操作的影響。

輸出包括出現(xiàn)在 MDC 解決方案中的 coarsified 維度的每個(gè)表的生成列描述,以及對(duì)每個(gè)表的一個(gè) ORGANIZE BY 子句建議。

使用下列設(shè)計(jì)顧問程序的最佳實(shí)踐:

  • 提供能廣泛代表你的工作負(fù)載的輸入,不要只為一個(gè)查詢運(yùn)行設(shè)計(jì)顧問程序。這使設(shè)計(jì)顧問程序生成可以應(yīng)用于整個(gè)工作負(fù)載的建議,而不是僅僅針對(duì)一個(gè)查詢。這或許會(huì)損害其他部分的工作負(fù)載。
  • 包括輸入像 INSERT、UPDATE 和 DELETE 這些發(fā)生在你工作負(fù)載的操作,這樣設(shè)計(jì)顧問程序能對(duì)查詢的缺點(diǎn)和優(yōu)勢(shì)進(jìn)行建模(關(guān)于添加新的設(shè)計(jì)功能)。例如,新的索引是否在不利于維護(hù)之外能提高查詢執(zhí)行時(shí)間。
  • 使用 DB2 設(shè)計(jì)顧問程序的 MDC 選擇能力(在大小超過 12 個(gè)擴(kuò)展數(shù)據(jù)塊大小的表上)來(lái)獲得 MDC 的建議維度,以提高工作負(fù)載性能。
  • 使用 Query Patroller 或 DB2 9.5 負(fù)載管理器,來(lái)自動(dòng)以某種格式抓取你的具體工作負(fù)載作為設(shè)計(jì)顧問程序的輸入。




回頁(yè)首


結(jié)論

物理數(shù)據(jù)庫(kù)設(shè)計(jì)對(duì)任何數(shù)據(jù)庫(kù)而言都是最重要的品質(zhì)。它影響數(shù)據(jù)庫(kù)的靈活性、有效性、可維護(hù)性和可擴(kuò)展性,就像沒有其它方面的數(shù)據(jù)庫(kù)管理。雖然數(shù)據(jù)庫(kù)設(shè)計(jì)很復(fù)雜,但是一個(gè)良好的設(shè)計(jì)可以提升性能并降低操作風(fēng)險(xiǎn)。掌握這些無(wú)疑是專業(yè)數(shù)據(jù)庫(kù)管理員的基石。



參考資料

學(xué)習(xí)

獲得產(chǎn)品和技術(shù)
  • 使用可直接從 developerWorks 下載的 IBM 產(chǎn)品評(píng)估試用軟件 構(gòu)建您的下一個(gè)開發(fā)項(xiàng)目。

  • 現(xiàn)在可以免費(fèi)使用 DB2。下載 DB2 Express-C,這是為社區(qū)提供的 DB2 Express Edition 的免費(fèi)版本,它提供了與 DB2 Express Edition 相同的核心數(shù)據(jù)特性,為構(gòu)建和部署應(yīng)用程序奠定了堅(jiān)實(shí)的基礎(chǔ)。

     

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多