資源描述:
《SQL_SERVER__分區(qū)函數(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、SQLSERVER分區(qū)表大凡在應(yīng)用系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)中行走江湖多年的朋友,都會(huì)面臨數(shù)據(jù)統(tǒng)計(jì)、分析以及歸檔的問(wèn)題,企業(yè)信息化進(jìn)程加速了各種數(shù)據(jù)的極具增長(zhǎng),商務(wù)智能(BI)的出現(xiàn)和實(shí)施著實(shí)給信息工作者和決策者帶來(lái)了絕妙的體驗(yàn),但從OLTP向OLAP系統(tǒng)加載數(shù)據(jù)是很頭疼的事,常常需要數(shù)分鐘或數(shù)小時(shí),解決這一問(wèn)題的技術(shù)之一便是分區(qū)表,一旦實(shí)施了分區(qū)表,這樣的操作往往只需幾秒鐘,太讓人興奮了。而大型表或索引經(jīng)過(guò)分區(qū)后更容易進(jìn)行管理,因?yàn)檫@樣可以快速高效地管理和訪問(wèn)數(shù)據(jù)子集,同時(shí)維護(hù)數(shù)據(jù)集合的完整性。分區(qū)表的數(shù)據(jù)分布于一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)文件組單元中,數(shù)據(jù)是按水平方式分區(qū)的(數(shù)據(jù)分
2、區(qū)的多種方式會(huì)在分區(qū)表前傳中闡述),因此一個(gè)表的某些行映射到某個(gè)分區(qū),而另外一些行映射到另外某個(gè)分區(qū),以此類推。當(dāng)對(duì)數(shù)據(jù)進(jìn)行查詢或更新時(shí),表將被視為單個(gè)邏輯實(shí)體,所以在數(shù)據(jù)訪問(wèn)層你會(huì)感覺和訪問(wèn)普通表一樣,而好處就在于可以查詢想要的某個(gè)分區(qū),而不必掃描整個(gè)表。有一點(diǎn)必須明白,單個(gè)表的所有分區(qū)都必須位于同一個(gè)數(shù)據(jù)庫(kù)中。分區(qū)表支持和標(biāo)準(zhǔn)表相關(guān)的所有屬性和功能,包括約束、默認(rèn)值、標(biāo)識(shí)和時(shí)間戳值以及觸發(fā)器等。決定是否實(shí)現(xiàn)分區(qū)主要取決于表當(dāng)前的大小或?qū)?lái)的大小以及對(duì)表執(zhí)行查詢和維護(hù)操作的完善程度。通常,如果某個(gè)大型表同時(shí)滿足下列兩個(gè)條件,則可能適于進(jìn)行分區(qū):1,該表包含或?qū)?/p>
3、以多種不同方式使用的大量數(shù)據(jù)2,維護(hù)開銷超過(guò)了預(yù)定義的維護(hù)期例如,如果對(duì)當(dāng)前年份或當(dāng)前月份的數(shù)據(jù)主要執(zhí)行SELECT、INSERT、UPDATE和DELETE操作,而對(duì)以前年份或以前月份的數(shù)據(jù)主要執(zhí)行SELECT查詢,則如果按年份或月份對(duì)表進(jìn)行分區(qū),表的管理要容易些,因?yàn)榇藭r(shí)對(duì)表的維護(hù)操作只針對(duì)一個(gè)數(shù)據(jù)子集。如果該表沒有分區(qū),那么就需要對(duì)整個(gè)數(shù)據(jù)集執(zhí)行這些操作,這樣就會(huì)消耗大量資源。所以常常根據(jù)日期和分類對(duì)表進(jìn)行分區(qū),當(dāng)然利用某個(gè)標(biāo)識(shí)列ID也是很好的選擇。例如,電子商務(wù)數(shù)據(jù)庫(kù)的某張表可能包含了近6年的數(shù)據(jù),但是只定期訪問(wèn)本年度或某個(gè)月的數(shù)據(jù),那么就可以按年份或月份分
4、區(qū),而另外一張表包含了近幾十種類型商品的訂單,那么此時(shí)可以為每種類型商品分一個(gè)區(qū)。一般而言,衡量大型表是以數(shù)據(jù)為標(biāo)準(zhǔn)的,但對(duì)于適合分區(qū)的大型表,衡量大型表更重要的是對(duì)數(shù)據(jù)訪問(wèn)的性能,如果對(duì)于某些表的訪問(wèn)和維護(hù)有較嚴(yán)重的性能問(wèn)題,就可以視為大型表,就應(yīng)該考慮通過(guò)更好的設(shè)計(jì)和分區(qū)來(lái)解決性能問(wèn)題。創(chuàng)建分區(qū)表必須經(jīng)過(guò)如下三個(gè)步驟:1,創(chuàng)建分區(qū)函數(shù)2,創(chuàng)建映射到分區(qū)函數(shù)的分區(qū)方案3,創(chuàng)建使用該分區(qū)方案的分區(qū)表分區(qū)函數(shù)分區(qū)函數(shù)是數(shù)據(jù)庫(kù)中的一個(gè)獨(dú)立對(duì)象,它將表的行映射到一組分區(qū),所以分區(qū)函數(shù)解決的是HOW的問(wèn)題,即表如何分區(qū)的問(wèn)題。創(chuàng)建分區(qū)函數(shù)時(shí),必須指明數(shù)據(jù)分區(qū)的邊界點(diǎn)以及分區(qū)
5、依據(jù)列,這樣便知道如何對(duì)表或索引進(jìn)行分區(qū)。分區(qū)函數(shù)的創(chuàng)建語(yǔ)法如下:CREATEPARTITIONFUNCTIONpartition_function_name(input_parameter_type)ASRANGE[LEFT
6、RIGHT]FORVALUES([boundary_value[,...n]])[;]分區(qū)函數(shù)語(yǔ)法的相關(guān)解釋:1,創(chuàng)建一個(gè)分區(qū)函數(shù)和創(chuàng)建一個(gè)普通的數(shù)據(jù)庫(kù)對(duì)象(例如表)沒什么區(qū)別。所以根據(jù)標(biāo)準(zhǔn)語(yǔ)法走就OK了。2,partition_function_name是分區(qū)函數(shù)的名稱。分區(qū)函數(shù)名稱在數(shù)據(jù)庫(kù)內(nèi)必須唯一,并且符合標(biāo)識(shí)符的規(guī)則。3,input_
7、parameter_type是用于分區(qū)的列的數(shù)據(jù)類型,習(xí)慣把它稱為分區(qū)依據(jù)列。當(dāng)用作分區(qū)列時(shí),除text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、別名數(shù)據(jù)類型或CLR用戶定義數(shù)據(jù)類型外,其他所有數(shù)據(jù)類型均有效。分區(qū)依據(jù)列是在CREATETABLE或CREATEINDEX語(yǔ)句中指定的。4,boundary_value[,...n]中的boundary_value是邊界值(或邊界點(diǎn)的值),n代表可以最多有n個(gè)邊界值,即n指定boundary_value提供的值的數(shù)目,但n不能
8、超過(guò)999。所創(chuàng)建的分區(qū)數(shù)等于n+1。不必按順序列出各值。如果值未按順序列出,則DatabaseEngine將對(duì)這些邊界值進(jìn)行排序,創(chuàng)建分區(qū)函數(shù)并返回一個(gè)警告,說(shuō)明未按順序提供值。如果n包括任何重復(fù)的值,則數(shù)據(jù)庫(kù)引擎將返回錯(cuò)誤。邊界值的取值一定是和分區(qū)依據(jù)列相關(guān)的,所以只能使用CREATETABLE或CREATEINDEX語(yǔ)句中指定的一個(gè)分區(qū)列。5,LEFT
9、RIGHT指定boundary_value[,...n]的每個(gè)boundary_value屬于每個(gè)邊界值間隔的哪一側(cè)(左側(cè)還是右側(cè))。如果未指定,則默認(rèn)值為L(zhǎng)EFT。例如我們可以依據(jù)某個(gè)表的int列來(lái)創(chuàng)建分