2009 年 9 月 24 日 物 理數(shù)據(jù)庫設(shè)計是影響數(shù)據(jù)庫性能的一個最重要的因素。物理數(shù)據(jù)庫設(shè)計涵蓋了所有和數(shù)據(jù)庫物理結(jié)構(gòu)相關(guān)的設(shè)計功能,比如表規(guī)范化和反規(guī)范化、索引、物化視圖、 數(shù)據(jù)集群、多維數(shù)據(jù)集群、表(range)分區(qū)還有數(shù)據(jù)庫(hash)分區(qū)。本文從MDC、數(shù)據(jù)庫分區(qū)、視圖以及后設(shè)計工具方面闡述物理數(shù)據(jù)庫設(shè)計最佳實 踐。
MDC 是一個同時有不止一個維度數(shù)據(jù)集群的技術(shù)。然而,你也可以對一個維度使用 MDC 集群,就像你可以使用一個集群索引一樣。 MDC 的一個好處是它能保證數(shù)據(jù)一直處于集群狀態(tài),永遠不需要執(zhí)行一個重組操作來重新建立較高的集群命中率。 而 且,不同于用 CREATE INDEX 語法創(chuàng)建的傳統(tǒng)索引,MDC 是對表中的每一行建立索引,MDC 通過塊把表中的數(shù)據(jù)編入索引。每個塊和表所在的表空間中的擴展數(shù)據(jù)塊有相同的大小。當(dāng) CREATE INDEX 命令創(chuàng)建索引時,每一行數(shù)據(jù)頁會同時被編入索引,每個 MDC 表索引 BLOCKS 可以包含上千條數(shù)據(jù)。 MDC 索引,也叫 BLOCK INDEX,通常只有 1/1000 大小基于索引的行,而且不光為索引提供了大量的保留存儲空間,同時也為所有 BLOCK INDEX 操作(索引掃描、索引 ANDing、索引 ORing,等等)提供了非常好的性能。 要理解 MDC,你必須首先理解一些基礎(chǔ)術(shù)語:單元是表容納數(shù)據(jù)的部分,它有一套唯一的維度值 ,是每個維度切片相交形成的。塊是存儲單元等于一個擴展數(shù)據(jù)塊(一個或多個頁面),塊被用來存儲一個單元。 如 上面所述,除了它們指向的是塊而不是記錄,塊索引在結(jié)構(gòu)上和普通索引是一樣的。塊索引比普通索引要更小,因為塊大小是一個頁面中的平均記錄數(shù)的數(shù)倍。如圖 4 中所示,同每一行每一個單獨的輸入相比,在一個塊索引中每塊都有一個單獨的索引。結(jié)果就是,一個塊索引顯著降低了磁盤使用率并明顯加快了數(shù)據(jù)訪問的速度。 圖 4. 行索引和塊索引有什么不同 ![]() 圖 5 中顯示的 MDC 表示一個物理組織,比如所有記錄有相同的“ Region ”以及“ Year ”值都同每個塊或擴展數(shù)據(jù)塊中連在一起。 圖 5. 一個多維集群表 ![]() 甚至一個只定義一個維度的 MDC 表也可以從這些 MDC 屬性中獲益,而且可以替換一個有集群索引的普通表。這個決定應(yīng)該基于很多因素,包括組成工作負載的查詢以及表中數(shù)據(jù)的性質(zhì)和分布。 在 MDC 表中自動維護數(shù)據(jù)集群確保了使用復(fù)合塊索引。這些索引被用來根據(jù)在 INSERTS 操作過程中的表的維度來動態(tài)管理和維護數(shù)據(jù)庫的物理集群。當(dāng)一個插入發(fā)生了,合成塊索引將會在與被插入記錄的維度值相應(yīng)的邏輯單元中被探測到。 如圖 6 所示,在索引中的邏輯單元的鍵值,它的塊 ID(BIDs)的列表完整的給出了表中有這個本地單元維度值的塊列表。這限制了給插入記錄搜索可用空間的表的擴展數(shù)據(jù)塊的數(shù)目。 圖 6. 在‘ YearAndMonth ’,‘ Region ’上的復(fù)合塊索引 ![]() 因 為集群是自動維護的,所以對 MDC 表來說不需要重組操作來重新集群數(shù)據(jù)。然而,重組仍然被用來釋放空間。例如,如果單元有很多分散的塊,數(shù)據(jù)很少能夠匹配到,或者,如果表有很多指針溢出, 這個表的重組操作將壓縮屬于邏輯單元的記錄到最少的塊中,用時也刪除指針溢出對。 MDC 的意義非常深遠。在某些情況下它能將復(fù)雜查詢的性能提高 10 倍以上,同時你還可以用它轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)。還有下面顯示的其他好處:
下面的例子顯示了如何定義一個 MDC 表:
ORGANIZE By 子句定義了集群的維度。這個表同時在 C5 和 C3 上被集群。 C1 是 coarsified C5,它包含很少的不同值(天減少為月)。 注意:由 coarsified 產(chǎn)生的 columns(s) 被使用在 MDC 塊索引中,以提高單元級別的數(shù)據(jù)清除。 MDC 設(shè)計的一個關(guān)鍵是謹慎選擇集群的維度。如果你選擇的集群維度產(chǎn)生太多的單元,存儲的成本會顯著的增加。知道其中的原因非常重要。在一個 MDC 表中,每個單元都會根據(jù)需要的存儲塊來分配。存儲塊是設(shè)計為和表所在表空間的擴展數(shù)據(jù)塊的大小相等。如果一個單元沒有數(shù)據(jù),那么存儲塊的數(shù)據(jù)是 0 。然而,在一個單元中存儲了若干記錄的典型表中會造成給單元分配一個或多個存儲塊。對每個有數(shù)據(jù)的單元都會有一批通常只包含了被部分填充數(shù)據(jù)塊。因此,在 每個單元(不是數(shù)據(jù)塊)中造成浪費和存儲塊的大小成比例。新數(shù)據(jù)庫只有個在前面的數(shù)據(jù)塊被填滿(或快滿)后被創(chuàng)建。如果行被刪除,數(shù)據(jù)庫管理器會嘗試盡可 能多的重用空間。 存儲塊被設(shè)計為同這個表所在表空間的擴展數(shù)據(jù)塊大小相等。如果這個表的單元數(shù)目非常大,存儲的浪費也會很大。如 果 MDC 很差而且產(chǎn)生了大量的單元,表的存儲需求會非常顯著的增加,而且 MDC 的性能也會受損。然而,設(shè)計的 MDC 表只會比非 MDC 表大一點,而且在集群和數(shù)據(jù)轉(zhuǎn)入轉(zhuǎn)出上提供了較大的好處(將在后面討論) 圖 7 顯示存儲塊和單元分配。如圖所示,每個單元都包含了一批存儲塊。絕大多數(shù)塊被數(shù)據(jù)填充,不過對于每個單元的最后一個塊,卻是或多或少被部分填充的。 圖 7. MDC 單元存儲 ![]() 如果你有樣本數(shù)據(jù)或具體數(shù)據(jù),你就可以使用 SQL 來為所有可能的 MDC 設(shè)計度量 MDC 需要的單元數(shù)目,如下所示:
對一個 3 維的 MDC 表來說,COL1、COL2 和 COL3 是 MDC 的維度。結(jié)果數(shù)乘以表的擴展數(shù)據(jù)塊大小將得出一個在表被轉(zhuǎn)換為 MDC 過程中擴展數(shù)據(jù)塊增長(不是大小)的上限。 MDC 的其他核心價值是 DB2 數(shù)據(jù)庫管理器在表的 MDC 維度上自動為 MDC 表創(chuàng)建索引。這些特殊的索引對塊而非行建立索引,這是可行的。因為在 MDC 表中數(shù)據(jù)會一直保持集群,因此在相同塊中的所有的行同樣確保有相同的鍵值。這是由于在 MDC 中數(shù)據(jù)是對塊進行索引而非記錄,所以塊索引通常是傳統(tǒng)基于行的索引的 1/1000 大小。結(jié)果就是在相關(guān)查詢運行時的性能好處,并把 INSERT、UPDATE 和 DELETE 操作的開銷減到了最少。 MDC 提供的功能方便了數(shù)據(jù)的轉(zhuǎn)入和轉(zhuǎn)出。索引條目指向一個塊而不是一行,塊索引又比典型的(rowID)RID 索引要小很多。因此,當(dāng) MDC 在轉(zhuǎn)入處理時只有很少的塊索引 I/O,這是因為塊索引只在塊被寫滿的時候被更新一次(而不是每一行插入)。由于 MDC 重用已經(jīng)存在的空塊不需要分頁,所以插入也很快。插入時加的鎖也少了,因為他們發(fā)生在一個塊級別而不是行級別。表在轉(zhuǎn)入和轉(zhuǎn)出后不需要 REORG 數(shù)據(jù)。 想要為一個傳統(tǒng)事實表基于 Date、Product Name 和 Region 創(chuàng)建一個 MDC 。這里有一些在創(chuàng)建 MDC 時需要考慮的變量:
開始創(chuàng)建 MDC 如果 MDC 直接創(chuàng)建在 Date, Product 和 Region 列上,每天將會產(chǎn)生 1,000,000 個新的單元(1 x 100,000 x 10),而每年則會產(chǎn)生 365,000,000 個單元。 如果區(qū)域中事務(wù)非常少,這將會有很多分散甚至是空的頁面。這會導(dǎo)致大量沒有必要的空間分配數(shù)量巨大的單元(頁面)用來容納塊數(shù)據(jù)。這非常不好。 開始 MDC 的創(chuàng)建 使用函數(shù)來 coarsify 和限制 MDC 的基數(shù),例如:
使用這個場景中的建議,MDC 將會每年產(chǎn)生 12*26*10 = 3210 個單元或每天 8-9 個單元。這會消除很多頁面沒有數(shù)據(jù)的情況,并對 MDC 提供合理的基數(shù)來獲得性能的好處。 MDC 是設(shè)計來為查詢和許多刪除場景提供極大性能好處。雖然如此,在對使用了集群索引的集群表提供顯著的性能好處的同時,MDC 表這么做所帶來的開銷還是超過了非集群表。 MDC 和非集群表相比第一個開銷是:
然而,當(dāng)和使用集群索引而集群起來的表相比較的話,MDC 有著顯著的性能優(yōu)勢:
無 論使用集群索引還是用 MDC 來進行索引,在這兩種情況下 DB2 數(shù)據(jù)庫管理器都將在 INSERT 到目標(biāo)記錄的位置時訪問索引(塊索引的集群索引),并在 INSERT 過程中判斷記錄的目標(biāo)位置。再強調(diào)一下這個索引非常小,而且樹的高度通常很短,因此搜索速度非???。 MDC 的價值要比集群索引高很多,因為它可以自動保證集群。根據(jù) coarsification 的需求,MDC 的集群率通??梢赃_到 93%-100% 之間的某個值。相比之下,集群索引雖然可以在一開始就接近 100%,但是隨著時間的推移卻會變得不集群,因而需要花費時間來對數(shù)據(jù)重新集群。一般情況下,使用 MDC 在你的數(shù)據(jù)庫上創(chuàng)建和維護數(shù)據(jù)集群,除非:
使用下面的 MDC 設(shè)計的最佳實踐:
注意:BLOCK 索引與相應(yīng)的表相比非常的小,在大多數(shù)情況下,你可以忽略它們的存儲需求。
數(shù)據(jù)庫分區(qū)(不共享 hash 分區(qū))的最佳實踐 數(shù)據(jù)庫分區(qū)是一個在數(shù)據(jù)庫中跨多個彼此合作的實例以建立單個大型數(shù)據(jù)庫服務(wù)器的水平分布記錄的技術(shù)。這些實例可以位于一個服務(wù)器中、跨多個物理機器、或它們的組合。在 DB2 產(chǎn)品中,這個叫數(shù)據(jù)庫分區(qū)功能(DPF)。 數(shù) 據(jù)庫分區(qū)允許 DB2 數(shù)據(jù)庫管理器擴充到上百個實例參與的大型數(shù)據(jù)庫系統(tǒng)。這個設(shè)計的可伸縮性能使很多復(fù)雜查詢的工作負載達到線性增長。這樣,因為數(shù)據(jù)庫分區(qū)接近線性的擴展特 征以及數(shù)據(jù)規(guī)模能達到數(shù)百 T 以及上百個 CPUs,數(shù)據(jù)庫分區(qū)在數(shù)據(jù)倉庫和 BI 工作負載下變得非常流行。由于每個事物都會產(chǎn)生實例內(nèi)部的通訊,而這即使很少卻也能嚴(yán)重影響在 OLTP 工作負載中常見的短期執(zhí)行事務(wù)類型,因此這個架構(gòu)在 OLTP 處理上用的較少。 不共享 hash 分區(qū)是把記錄 hash 分布到邏輯數(shù)據(jù)分區(qū)上。 Hash 分布的主要的設(shè)計目的是確保數(shù)據(jù)均勻分布到所有邏輯節(jié)點(因為范圍分區(qū)容易發(fā)生數(shù)據(jù)傾斜)。這些分區(qū)可能存在于一個服務(wù)器中或者分布到一批物理機器上,如圖 9 所示: 圖 9. 表上的 hash 分區(qū) ![]() 不 共享數(shù)據(jù)庫的擴展性已經(jīng)在大多數(shù)查詢工作負載接近于線性的擴展上得到了證明。同樣,模塊化的設(shè)計讓使它的存儲壓力、工作壓力或它們兩個也都線性增長。結(jié)果 就是在過去十年中不共享結(jié)構(gòu)在數(shù)據(jù)倉上的統(tǒng)治地位。數(shù)據(jù)庫分區(qū)可以在不影響現(xiàn)有應(yīng)用代碼的情況下使用,而且對它們是完全透明的。使用 redistribution 實用工具,可以在線更改分區(qū)策略而應(yīng)用代碼不會受到影響。 最主要的選擇就是決定哪些列用來 hash 分割每個表,并且這些列包含數(shù)據(jù)庫分區(qū)鍵值。這有兩個目標(biāo):
使用下面的數(shù)據(jù)庫分區(qū)的最佳實踐:
在設(shè)計不共享數(shù)據(jù)倉庫分區(qū)時的其他問題是如何判斷最佳的內(nèi)存、CPUs、總線、存儲能力、存儲帶寬的組合,那么,它們分別需要多少呢? 要解決這個問題,IBM 提供了 IBM Balanced Warehouse,它基于不共享架構(gòu)的數(shù)據(jù)庫系統(tǒng)。它是通過成功的客戶運行開發(fā)的 IBM 最佳實踐。 Balanced Warehouse 和 Balanced Configuration Units(BCU) Balanced Warehouse 又被稱作 Balanced Configuration Units(BCU)的構(gòu)件。這些構(gòu)件是為了性能進行預(yù)配置、預(yù)測試而調(diào)試過的,用以提供一個理想的數(shù)量和比例的資源。 BCU 結(jié)合了數(shù)據(jù)庫配置和硬件組成的最佳實踐,盡可能的簡化數(shù)據(jù)倉庫的安裝和配置。幾十個資源率和數(shù)據(jù)庫配置的最佳實踐都被整合進了 Balanced Warehouse 。 圖 10:顯示了 Balanced Warehouse 在 2007 年和 2008 年提供的多種產(chǎn)品。你可以看到,Balanced Warehouse 現(xiàn)在提供了 3 種產(chǎn)品:C、D 和 E 。這 3 種產(chǎn)品提供了持續(xù)增強能力和可擴展性的解決方案。 C 級別是一個提供給市場的入門級別,或可以集成進一臺服務(wù)器中的系統(tǒng)。 D 和 E 級利用 DB2 數(shù)據(jù)庫分區(qū)能力,提供了可以擴展到相當(dāng)規(guī)模的配置。 圖 10. Balanced Warehouse 的產(chǎn)品,2007-2008 ![]()
表分區(qū) 應(yīng)該被用來顯著的提高轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)。它允許管理員添加一個大范圍的數(shù)據(jù)(比如某月新的數(shù)據(jù))到一個表中 en-masse 而且更重要的是管理員幾乎可以同時從表或從數(shù)據(jù)庫 en-masse 中刪除數(shù)據(jù)。 DB2 數(shù)據(jù)庫系統(tǒng)的唯一異步索引清除技術(shù)意味著就算全局索引的數(shù)據(jù)跨多個范圍分區(qū),也可以從表中分離一個范圍分區(qū),甚至這個范圍分區(qū)的相關(guān)索引鍵對進來的查詢也 變得立即不可見了。這些鍵值會被后臺進程隨后以對負載幾乎可以忽略不計的影響不動聲色的刪除。數(shù)據(jù)庫分區(qū)也能通過一個叫分區(qū)清除的內(nèi)部進程帶來提高查詢性 能的好處,在很多情況下這個進程允許查詢編譯器選擇改良過的查詢計劃,這是表分區(qū)的第二個好處。 表分區(qū)也允許你把一個表分成多個范圍,存儲在一個數(shù)據(jù)庫分區(qū)里的一個或多個物理對象中。表分區(qū)的目標(biāo)是對數(shù)據(jù)進行邏輯重組,使優(yōu)化數(shù)據(jù)訪問和轉(zhuǎn)出數(shù)據(jù)更容易。這個表的分割引用程序是透明的,而且因此可以在應(yīng)用程序開發(fā)周期的任何時候進行。 更多關(guān)于表分區(qū)的信息見文章“最佳實踐:數(shù)據(jù)生命周期管理”。 表分區(qū)包括下列其他屬性和功能:
下面的例子顯示了如何定義一個分區(qū)表:
這個語句結(jié)果會創(chuàng)建 4 個表對象,每個都存儲一個范圍的數(shù)據(jù),如圖 8 所示: 圖 8. 數(shù)據(jù)范圍表分區(qū) ![]() 使用下列表分區(qū)的最佳實踐:
DB2 9 表分區(qū)之前版本的分區(qū)能力,應(yīng)用程序經(jīng)常需要按范圍對數(shù)據(jù)進行分區(qū)。通過對每個范圍創(chuàng)建有相應(yīng)約束的表,DBAs 可以通過對所有這些表創(chuàng)建一個 UNION ALL 視圖提供一個單獨的系統(tǒng)視圖。例如:
對每個季度重復(fù)表創(chuàng)建 / 約束
然而,表分區(qū)為編譯器和優(yōu)化器提供了一個對表的單獨的視圖。和 UAV 相比,這允對不同的范圍使用許更多的侵略性謂詞,而且分區(qū)數(shù)據(jù)有更多的一致性模型。在大多數(shù)數(shù)據(jù)庫中,表分區(qū)現(xiàn)在是實現(xiàn)基于范圍的分區(qū)的首選方法。下面將討論一些例外。 UNION ALL 設(shè)計方法的優(yōu)勢是: 實用工具能在只包含一個范圍的表中執(zhí)行。最主要的考慮是: 復(fù)制,在某個確定范圍需要復(fù)制而其他范圍不需要復(fù)制時,使用 UNION ALL 視圖可以得到壓縮的好處(在 UAV 中的歷史表可以被壓縮)。 UNION ALL 視圖允許設(shè)計者存儲非壓縮數(shù)據(jù)到需要復(fù)制對象中,同時歷史數(shù)據(jù)可以存儲在其他壓縮對象中。 聯(lián)邦向終端用戶提供了一個聯(lián)邦數(shù)據(jù)(存儲在多個 IBM 或非 IBM 數(shù)據(jù)庫中)視圖。 對于 RORG,如果范圍經(jīng)常發(fā)生改變,就需要對范圍進行重新集群或壓縮。
比起 UNION ALL 分區(qū)方法,表分區(qū)具有下列優(yōu)勢:
可以用以下步驟來把 UNION ALL 視圖遷移到表分區(qū)中,而不需要移動數(shù)據(jù)。
使用下面 UNION ALL 視圖分區(qū)的最佳實踐:
數(shù)據(jù)庫分區(qū)、表分區(qū)和 MDC 在同一個數(shù)據(jù)庫中的最佳實踐 數(shù)據(jù)庫分區(qū)、表分區(qū)和 MDC 能同時應(yīng)用在一個設(shè)計中。
對于部署大型應(yīng)用程序這是一個最佳實踐方法。 例如:
更多信息請查看文章“最佳實踐:數(shù)據(jù)生命周期管理”。 使用下面的最佳實踐:
使用表分區(qū)和 MDC 最佳實踐來轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù) 設(shè)計你的分區(qū)策略,以使用表分區(qū)來作為轉(zhuǎn)出策略,并利用在單個維度的 MDC 作為你的轉(zhuǎn)入策略。 例如,如果你按日轉(zhuǎn)入,按月轉(zhuǎn)出,在 day 上指定一個 MDC 并以 month 為表分區(qū)鍵(支持計算值)。 這個方法就減少了分區(qū)數(shù),并簡化了 DBA 的管理任務(wù)。它利用了 MDC 轉(zhuǎn)入數(shù)據(jù)的優(yōu)勢(用塊索引減少索引 I/O 和日志)。 更多信息見文章“最佳實踐:數(shù)據(jù)生命周期管理”。 對轉(zhuǎn)入和轉(zhuǎn)出數(shù)據(jù)使用下面的最佳實踐:
使用表分區(qū)最佳實踐來轉(zhuǎn)入海量數(shù)據(jù) 可以使用表分區(qū)來為需要轉(zhuǎn)入龐大的數(shù)據(jù)量的應(yīng)用程序加速,這避免了執(zhí)行一致性檢查的需求。 還有一種連接分區(qū)的方法:你也可以 ALTER ADD 一個空表到一個表分區(qū)中。在表分區(qū)添加完成后,你可以用 Load 實用工具來填充表(允許對較老數(shù)據(jù)的只讀訪問)或者使用插入(這需要記日志)。 LOAD 可以提供出眾的性能,而且既可以從外部文件裝載,也可以使用 LOAD from cursor 從一個查詢定義裝載。 對應(yīng)用程序使用深度壓縮,DB2 9.5 在轉(zhuǎn)入數(shù)據(jù)時使用這個技術(shù)非常容易,因為它提供了自動字典壓縮,從而避免了用 REORG 來壓縮數(shù)據(jù)的需求。 更多信息見文章“最佳實踐:數(shù)據(jù)生命周期管理”。 使用下面轉(zhuǎn)入和轉(zhuǎn)出的最佳實踐:
MQT 表是基于一個查詢結(jié)果定義的表。 MQT 包含了預(yù)先計算的結(jié)果。 MQTs 是一個提高復(fù)雜查詢響應(yīng)時間的強大的方式,尤其是有下面幾類數(shù)據(jù)操作需求的查詢:
為了加速查詢性能,MQTs 可以被用在聯(lián)邦數(shù)據(jù)源的別名上,得以在本地保持頻繁訪問數(shù)據(jù)。他們可以通過復(fù)制來維護(系統(tǒng)維護選項不被支持)。在一個分區(qū)數(shù)據(jù)庫中,復(fù)制 MQTs 可以用來減少網(wǎng)絡(luò)流量。 MQT 對應(yīng)用程序是完全透明的。 MQT 的知識已經(jīng)被整合進 SQL 和 XQuery 編譯器中,它們會判斷是否 MQT 應(yīng)該被用來響應(yīng)一個查詢的所有部分。因此,你可以在不改變應(yīng)用程序代碼的情況下,創(chuàng)建和刪除 MQTs,就和你創(chuàng)建和刪除索引而不需要更改應(yīng)用程序一樣。 圖 11 根據(jù) MQTs 的刷新類型總結(jié)了它的特點。在表中,“ Optimization ”表示 DB2 數(shù)據(jù)庫管理器在運行一個查詢時,會利用延遲刷新的 MQT,。然而“ No optimization ”顯示 MQT 不會被使用,因為他可能已經(jīng)失效;。也就是說,數(shù)據(jù)庫管理器不知道 MQT 什么時候被刷新了。 圖 11. MQT 刷新特點的總結(jié) ![]() 注意:MQTs 會降低基礎(chǔ)表上的插入性能。 為了幫助問題診斷,DB2 9 解釋工具顯示了為什么一個 MQT 在訪問路徑中不被采用。 使用下列 MQT 設(shè)計的最佳實踐:
后設(shè)計工具來提高現(xiàn)有數(shù)據(jù)庫設(shè)計 Explain 工具可以向你顯示是否使用了設(shè)計功能。例如,它可以向你顯示在 QEP 中是否訪問了索引、是否使用了分區(qū)消除以及是否查詢被路由到了 MQTs 。 考慮圖 12 中 explain 工具顯示的 TPC-H 查詢關(guān)于的 QEP 片段。 圖 12. TPC-H 查詢 20 的 QEP 片段 ![]() QEP 明確的顯示了 PARTSUPP 需要訪問 TPCD.UXPS_PK2KSC 索引和 PARTSUPP 表自己的信息。你如何判斷原因? 查 看 operator(15),你可以看到 FETCH 聚集需要訪問 PARTSUPP 表,因為索引包含 PS_PARTKEY 和 PS_SUPPKEY 列,卻不包括 PS_AVAILQTY 列。強烈建議把 PS_AVAILQTY 列也加到索引中,這樣你可以避免在輔助方案中訪問 PARTSUPP 表,會因此提高性能。 圖 13 中顯示的 explain 輸出表明了優(yōu)化器在 QEP 中考慮了那些 MQTs 卻沒有選擇,以及沒有選擇的原因。這個原因可能是由于成本或 MQT 匹配度不夠。 圖 13. 使用 explain 工具來理解 MQT 選擇 ![]() 使用下列 explain 工具的最佳實踐:
DB2 設(shè)計顧問程序是 DB2 自主計算的一個關(guān)鍵功能。它是一鍵式解決方案:提供一個工作負載(由用戶提供或系統(tǒng)提供)以及可選擇的磁盤約束,設(shè)計顧問程序建議物理數(shù)據(jù)庫設(shè)計選項,這 些選項設(shè)計可以優(yōu)化工作負載。設(shè)計顧問程序進行廣泛的“假設(shè)”分析、數(shù)據(jù)抽樣和關(guān)聯(lián)模式來探索上千種設(shè)計排列,這些是人工無法做到的。 設(shè)計顧問程序有下列能力:
很多客戶反映使用設(shè)計顧問程序來動態(tài)提高物理數(shù)據(jù)庫設(shè)計,在整個生命周期內(nèi)引導(dǎo)一個查詢或提升整個工作負載的性能。當(dāng)然,你不要不經(jīng)過考慮就應(yīng)用來自設(shè)計顧問程序的結(jié)果。 圖 14 強調(diào)了設(shè)計顧問程序的好處。在這個例子中,一個決策支持數(shù)據(jù)庫運行在 TPC-H 工作負載上而且為數(shù)據(jù)集創(chuàng)建了合理的索引,也就是說,一個優(yōu)秀的數(shù)據(jù)庫設(shè)計人員設(shè)計了這一切,并認為這已經(jīng)足夠了。然后使用設(shè)計顧問程序?qū)?shù)據(jù)庫提出額外 的建議,而應(yīng)用設(shè)計顧問程序的結(jié)果帶來了 6.5 倍的性能提高。 圖 14. 來自于 DB2 設(shè)計顧問程序的好處 ![]() 為了提高工作負載性能,可以使用設(shè)計顧問程序 MDC 選擇能力來獲得 MDC 表維度的推薦值,包括基礎(chǔ)表上的 coarsifications 。雖然在一個表上可能會推薦一個或多個維度,但是只對那些只有一列且不是組合列的維度才會被考慮。 MDC 選擇能力是通過db2advis實用工具使用 -m <advise type> 標(biāo)記啟用的。建議類型( “ C ”對應(yīng) MDC 和集群索引、“ I ”對應(yīng)索引、“ M ”對應(yīng) MQT 以及“ P ” 對應(yīng)數(shù)據(jù)庫分區(qū))可以互相聯(lián)合。 設(shè)計顧問程序提供的 MDC 建議,總會提供良好的密度和在表被轉(zhuǎn)換成 MDC 時會發(fā)生的表膨脹總量限制。設(shè)計顧問程序中的分析操作不僅包括塊索引的好處,而且也包括了 MDC 對插入的影響,以及刪除表維度操作的影響。 輸出包括出現(xiàn)在 MDC 解決方案中的 coarsified 維度的每個表的生成列描述,以及對每個表的一個 ORGANIZE BY 子句建議。 使用下列設(shè)計顧問程序的最佳實踐:
物理數(shù)據(jù)庫設(shè)計對任何數(shù)據(jù)庫而言都是最重要的品質(zhì)。它影響數(shù)據(jù)庫的靈活性、有效性、可維護性和可擴展性,就像沒有其它方面的數(shù)據(jù)庫管理。雖然數(shù)據(jù)庫設(shè)計很復(fù)雜,但是一個良好的設(shè)計可以提升性能并降低操作風(fēng)險。掌握這些無疑是專業(yè)數(shù)據(jù)庫管理員的基石。 學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
|