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

字號:

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