|
在企業(yè)管理器中,雖然有“管理分區(qū)”的菜單,里面的內(nèi)容卻可能與你的預(yù)想不同,這里并沒(méi)有提供直接對(duì)分區(qū)進(jìn)行操作的方法,所以一些普通的操作,比如“增加分區(qū)”、“刪除分區(qū)”之類的操作就需要通過(guò)腳本實(shí)現(xiàn)了。
增加分區(qū)(Split Partition)
“增加分區(qū)”事實(shí)上就是將現(xiàn)有的分區(qū)分割開(kāi),基于此,在SQL Server中應(yīng)用的是Split操作。在分離分區(qū)的時(shí)候,不僅僅要在Partition Function上指定分割的分界點(diǎn),同樣需要在Partition Scheme上指定新分區(qū)應(yīng)用的文件組:
--指定下一個(gè)分區(qū)應(yīng)用文件組PRIMARY
ALTER PARTITION SCHEME [MyPartitionSchema]
NEXT USED [PRIMARY]
--指定分區(qū)分界點(diǎn)為5000
ALTER PARTITION FUNCTION MyPartitionFunction()
SPLIT RANGE (5000)
需要注意的一點(diǎn)是,新增的分區(qū)中非聚簇索引的壓縮模式會(huì)被置為None。
刪除分區(qū)(Merge Partition)
“刪除分區(qū)”同樣可以認(rèn)為是將原來(lái)分離的分區(qū)合并在一起,所以對(duì)應(yīng)的是Merge操作,而且由于并沒(méi)有新增的分區(qū),Partition Scheme并不需要改變:
ALTER PARTITION FUNCTION MyPartitionFunction ()
MERGE RANGE (5000)
切換分區(qū)(Switch Partition)
“切換分區(qū)”可能是一個(gè)比看上去會(huì)應(yīng)用的更頻繁的操作,它的意義在于將一個(gè)分區(qū)的數(shù)據(jù)從一張表切換到另一張表中。這里定義被切換分區(qū)的表為“源表”,被切換到的表為“目標(biāo)表”,則執(zhí)行切換操作的前提是:
- 源表和目標(biāo)表?yè)碛型瑯拥谋斫Y(jié)構(gòu),即同樣的字段、字段類型,同樣的索引結(jié)構(gòu)(聚簇和非聚簇),同樣的壓縮格式。但不要求默認(rèn)值約束一致(Default Constaint),也不要求目標(biāo)表設(shè)置了和源表一樣的自增長(zhǎng)列。
- 源表如果有索引且分區(qū),則其索引必須對(duì)齊。
- 源表中被切換的分區(qū)范圍必須包含于目標(biāo)表或者目標(biāo)表將要被切換到的分區(qū)范圍。這里有如下幾種情況:
- 將源表的源分區(qū)切換到目標(biāo)表的目標(biāo)分區(qū)中,則目標(biāo)分區(qū)范圍>=源分區(qū);
- 將源表的源分區(qū)切換到目標(biāo)表中(目標(biāo)表未分區(qū)),則目標(biāo)表沒(méi)有設(shè)約束,或約束范圍>=源分區(qū);
- 將源表切換到目標(biāo)表中(源表、目標(biāo)表都未分區(qū)),則只要目標(biāo)表沒(méi)有設(shè)約束就可以了(雖然Switch是分區(qū)提出的操作,但一個(gè)沒(méi)有分區(qū)的表同樣可以被看做一個(gè)大分區(qū),所以可以對(duì)沒(méi)有分區(qū)的表進(jìn)行Switch操作)。
- 目標(biāo)表或目標(biāo)分區(qū)不能含有數(shù)據(jù)。
下面的操作將源表的第二個(gè)分區(qū)切換到目標(biāo)表的第二個(gè)分區(qū)中。
ALTER TABLE [STable] SWITCH PARTITION 2 TO [DTable] PARTITION 2
分區(qū)管理操作的性能
分割、合并以及切換分區(qū)是元數(shù)據(jù)上的操作而不是對(duì)數(shù)據(jù)的移動(dòng),所以操作的效率要比直接操作數(shù)據(jù)高很多。
- 對(duì)于分割分區(qū),操作時(shí)間和被分割分區(qū)的數(shù)據(jù)量相關(guān),數(shù)據(jù)越大則分割花費(fèi)的時(shí)間會(huì)越長(zhǎng)。
- 對(duì)于合并分區(qū),如果將兩個(gè)空的分區(qū)合并,自然不會(huì)耗什么時(shí)間;如果兩個(gè)分區(qū)都有數(shù)據(jù),則和分割分區(qū)一樣,數(shù)據(jù)越大花費(fèi)的時(shí)間越長(zhǎng);如果兩個(gè)分區(qū)中有一個(gè)沒(méi)有數(shù)據(jù),筆者的經(jīng)驗(yàn)是如果有大數(shù)據(jù)量的分區(qū)在右(>分界值),則消耗的時(shí)間較短,如果有大數(shù)據(jù)量的分區(qū)在左(<分界值),則會(huì)消耗較多的時(shí)間。
- 對(duì)于切換分區(qū),即使是上千萬(wàn)級(jí)別的數(shù)據(jù),也可以在不到1秒的時(shí)間完成分區(qū)的切換。所以雖然從表面上看,切換分區(qū)和調(diào)用Select或者Insert語(yǔ)句移動(dòng)數(shù)據(jù)的結(jié)果是一樣的,但效率卻是不可同日而語(yǔ)的。
查看分區(qū)信息
除了利用上文提到的通過(guò)“管理壓縮”的方式查看某張表的分區(qū)信息之外,SQL Server還提供了一張系統(tǒng)表查看數(shù)據(jù)庫(kù)中的分區(qū)情況:
- SYS.PARTITION_SCHEMES,數(shù)據(jù)庫(kù)中所有分區(qū)方案的信息,包括對(duì)應(yīng)的分區(qū)函數(shù)的ID。
- SYS.PARTITION_FUNCTIONS,數(shù)據(jù)庫(kù)中所有分區(qū)函數(shù)的信息,包括分區(qū)數(shù)等信息。
- SYS.PARTITION_RANGE_VALUES,每個(gè)分區(qū)范圍的信息,可以和SYS.PARTITION_FUNCTIONS聯(lián)查。
比如可以通過(guò)如下的腳本,查出分區(qū)函數(shù)MyPartitionFunc的第一個(gè)分區(qū)的右邊界:
SELECT value FROM sys.partition_range_values, sys.partition_functions
WHERE sys.partition_functions.function_id = sys.partition_range_values.function_id
AND sys.partition_functions.name = 'MyPartitionFunc' AND boundary_id = 1
還可以通過(guò)如下腳本,獲取分區(qū)表中各分區(qū)的數(shù)據(jù)情況(行數(shù),最大值,最小值):
SELECT
partition = $PARTITION.MyParitionFunc([ParitionDate])
,rows = COUNT(*)
,min = MIN([ParitionDate])
,max = MAX([ParitionDate])
FROM [MyTable]
GROUP BY $PARTITION.MyParitionFunc([ParitionDate])
ORDER BY PARTITION
具體可以參照MSDN:從已分區(qū)表和索引中查詢數(shù)據(jù)和元數(shù)據(jù)
NET技術(shù):Sql Server性能優(yōu)化——Partition(管理分區(qū)),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。