SQLServer2008建立分區(qū)表(TablePartition)

字號(hào):

數(shù)據(jù)庫(kù)結(jié)構(gòu)和索引的是否合理在很大程度上影響了數(shù)據(jù)庫(kù)的性能,但是隨著數(shù)據(jù)庫(kù)信息負(fù)載的增大,對(duì)數(shù)據(jù)庫(kù)的性能也發(fā)生了很大的影響??赡芪覀兊臄?shù)據(jù)庫(kù)在一開(kāi)始有著很高的性能,但是隨著數(shù)據(jù)存儲(chǔ)量的急速增長(zhǎng)—例如訂單數(shù)據(jù)—數(shù)據(jù)的性能也受到了極大的影響,一個(gè)很明顯的結(jié)果就是查詢的反應(yīng)會(huì)非常慢。在這個(gè)時(shí)候,除了你可以優(yōu)化索引及查詢外,你還可以做什么?建立分區(qū)表(Table Partition)可以在某些場(chǎng)合下提高數(shù)據(jù)庫(kù)的性能,在SQL Server 2005中也可以通過(guò)SQL語(yǔ)句來(lái)創(chuàng)建表分區(qū),但在SQL Server 2008中提供了向?qū)问絹?lái)創(chuàng)建分區(qū)表。本文介紹了如何來(lái)創(chuàng)建分區(qū)表。
    什么是分區(qū)表?
    分區(qū)表是把數(shù)據(jù)按某種標(biāo)準(zhǔn)劃分成區(qū)域存儲(chǔ)在不同的文件組中,使用分區(qū)可以快速而有效地管理和訪問(wèn)數(shù)據(jù)子集,從而使大型表或索引更易于管理。合理的使用分區(qū)會(huì)很大程度上提高數(shù)據(jù)庫(kù)的性能。已分區(qū)表和已分區(qū)索引的數(shù)據(jù)劃分為分布于一個(gè)數(shù)據(jù)庫(kù)中多個(gè)文件組的單元。數(shù)據(jù)是按水平方式分區(qū)的,因此多組行映射到單個(gè)的分區(qū)。已分區(qū)表和已分區(qū)索引支持與設(shè)計(jì)和查詢標(biāo)準(zhǔn)表和索引相關(guān)的所有屬性和功能,包括約束、默認(rèn)值、標(biāo)識(shí)和時(shí)間戳值以及觸發(fā)器。因?yàn)榉謪^(qū)表的本質(zhì)是把符合不同標(biāo)準(zhǔn)的數(shù)據(jù)子集存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)文件組中,通過(guò)元數(shù)據(jù)來(lái)表述數(shù)據(jù)存儲(chǔ)邏輯地址。
    決定是否實(shí)現(xiàn)分區(qū)主要取決于表當(dāng)前的大小或?qū)?lái)的大小、如何使用表以及對(duì)表執(zhí)行用戶查詢和維護(hù)操作的完善程度。通常,如果某個(gè)大型表同時(shí)滿足下列兩個(gè)條件,則可能適于進(jìn)行分區(qū):
    ·該表包含(或?qū)┮远喾N不同方式使用的大量數(shù)據(jù)。
    ·不能按預(yù)期對(duì)表執(zhí)行查詢或更新,或維護(hù)開(kāi)銷超過(guò)了預(yù)定義的維護(hù)期。
    例如,如果對(duì)當(dāng)前月份的數(shù)據(jù)主要執(zhí)行 INSERT、UPDATE、DELETE 和 MERGE 操作,而對(duì)以前月份的數(shù)據(jù)主要執(zhí)行 SELECT 查詢,則按月份對(duì)表進(jìn)行分區(qū)可能會(huì)使表的管理工作更容易一些。如果對(duì)表的常規(guī)維護(hù)操作只針對(duì)一個(gè)數(shù)據(jù)子集,那么此優(yōu)點(diǎn)尤為明顯。如果該表沒(méi)有分區(qū),那么就需要對(duì)整個(gè)數(shù)據(jù)集執(zhí)行這些操作,這樣就會(huì)消耗大量資源。例如,通過(guò)分區(qū),可以針對(duì)具有只寫(xiě)數(shù)據(jù)的單個(gè)月份執(zhí)行類似索引重新生成和碎片整理的維護(hù)操作,而只讀數(shù)據(jù)仍可用于聯(lián)機(jī)訪問(wèn)。
    Transact-SQL ALTER TABLE...SWITCH 語(yǔ)句還可以快速有效地移動(dòng)數(shù)據(jù)子集。這也提供了很好的便利,讓我們可以放心的對(duì)數(shù)據(jù)表進(jìn)行全面的維護(hù)。
    怎么建立分區(qū)表?
    創(chuàng)建分區(qū)表分為以下幾個(gè)步驟:
    1.創(chuàng)建分區(qū)函數(shù)以指定如何分區(qū)使用該函數(shù)的表。(T-SQL: CREATE PARTITION FUNCTION)
    2.創(chuàng)建分區(qū)方案以指定分區(qū)函數(shù)的分區(qū)在文件組上的位置。(T-SQL: CREATE PARTITION SCHEMA)
    3.創(chuàng)建使用分區(qū)方案的表。
    以下步驟演示了如何在SQL Server 2008 Management Studio中通過(guò)向?qū)瓿蓜?chuàng)建分區(qū)表的過(guò)程。當(dāng)然,你也可以通過(guò)腳本來(lái)完成這些功能。
    1.在SQL Server 2008 Management Studio中選擇你想要?jiǎng)?chuàng)建分區(qū)表的對(duì)象,右鍵點(diǎn)擊表名選擇Storage –> Create Partition.
    2.在出現(xiàn)的Create Partition Wizard中點(diǎn)擊Next按鈕進(jìn)入Select a Partition Column頁(yè)面。
    3.在Select a Partition Column頁(yè)面設(shè)置基于哪個(gè)字段進(jìn)行數(shù)據(jù)子集劃分。在這里我們選擇EndDate。在后邊會(huì)對(duì)EndDate設(shè)置條件來(lái)劃分?jǐn)?shù)據(jù)子集。
    
    4.在Select a Partition Function頁(yè)面輸入一個(gè)名字來(lái)作為Function的名稱。這里我們輸入YearOrderPartitionFunction
    5.下一步是給創(chuàng)建的分區(qū)方案命名。在Select a Partition Schema頁(yè)面輸入YearOrderPartition作為名稱。
    6.在Map Partition頁(yè)面上我們?cè)O(shè)置分區(qū)標(biāo)準(zhǔn)。Left Boundary和Right Boundary是指符合區(qū)分標(biāo)準(zhǔn)的數(shù)據(jù)被放置到那個(gè)數(shù)據(jù)子集,對(duì)應(yīng)<=和<.
    7.點(diǎn)擊Set Boundaries來(lái)設(shè)置基于EndDate的數(shù)據(jù)子集劃分標(biāo)準(zhǔn)。
    
    8.點(diǎn)擊Estimate storage來(lái)估算每個(gè)數(shù)據(jù)子集的空間大小和其數(shù)據(jù)條目。根據(jù)設(shè)定的從2001-01-01到2004-12-31為止的所有數(shù)據(jù)按年劃分的標(biāo)準(zhǔn),我們最終得到了5個(gè)數(shù)據(jù)子集和一個(gè)用來(lái)存放最新數(shù)據(jù)的子集。這個(gè)新的數(shù)據(jù)子集對(duì)任何分區(qū)都是必須的,每個(gè)分區(qū)表中都會(huì)含有這個(gè)新的數(shù)據(jù)子集用來(lái)存放不同于數(shù)據(jù)標(biāo)準(zhǔn)劃分的所有子集的數(shù)據(jù)(在這里就是大于2005年1月1日的訂單)。
    
    9.接下來(lái)通過(guò)選擇以哪種方式運(yùn)行(Run Immediately或者Schedule或者Script)來(lái)結(jié)束向?qū)А7謪^(qū)表創(chuàng)建完成。
    創(chuàng)建表分區(qū)完成了,接下來(lái)你可以享受表分區(qū)帶給我們的優(yōu)越性了(如果你的選擇是正確的話),你還可以針對(duì)各個(gè)數(shù)據(jù)子集來(lái)進(jìn)行合并、刪除、移動(dòng)等。通過(guò)這些你可以很好的維護(hù)數(shù)據(jù)庫(kù)。在以后的post中我們會(huì)接下來(lái)介紹如何使用分區(qū)表。