未分區的表,相當於只有一個分區,只能存儲在一個FileGroup中;對表進行分區后,每一個分區都存儲在一個FileGroup,或分布式存儲在不同的FileGroup中。對表進行分區的過程,實際上是將邏輯上完整的一個表,按照特定的字段拆分成多個分區,分散到相同或不同的FileGroup中,每一個部分叫做表的一個分區(Partition),一個分區實際上是一個獨立的,內部的物理表。也就是說,分區表在邏輯上是一個表,而在物理上是多個完全獨立的表。
分區(Partition)的特性是:
- 每一個Partition在FileGroup中都獨立存儲,分區之間是相互獨立的
- 每一個parititon都屬於唯一的表對象,
- 每一個Partition 都有唯一的ID,
- 每一個Partition都有一個編號(Partition Number),同一個表的分區編號是唯一的,從1開始遞增;
當表分區后,加鎖的粒度從表級別降低到分區級別,這使得對一個分區執行更新操作,同時不會影響另一個分區的讀取操作。因此,分區可以降低並發查詢系統產生死鎖和阻塞的概率,提高數據操作的並發度。在創建表時,使用On 子句指定table存儲的邏輯位置:
- ON filegroup | "default" :表示邏輯存儲位置是單一的FileGroup;
- ON partition_scheme_name ( partition_column_name ) :表示邏輯存儲位置是分區架構,按照partition_column將table拆分成多個partition,每一個partition都存儲在一個指定的Filegroup中;
CREATE TABLE schema_name . table_name ( <column_definition> ) [ ON { partition_scheme_name ( partition_column_name ) | filegroup | "default" } ] [ WITH ( <table_option> [ ,...n ] ) ]
從存儲空間來理解分區,Partition實際上是表的一部分邏輯存儲空間。未分區表的邏輯存儲位置是FileGroup,分區表的邏輯存儲位置是Partition Scheme,但是,FileGroup指定一個特定的邏輯存儲位置,而Partition Scheme是分布式的,能夠將數據分布式存儲到不同的FileGroup中去。
跟邏輯存儲空間相對應的是物理存儲空間,物理存儲空間是由File指定的,FileGroup是File的集合,每一個File都屬於唯一的FileGroup。將table的存儲空間拆分到不同的FileGroup中,將table的物理存儲空間分布到不同的File中,只不過,不再是某一個FileGroup。實際存儲數據的文件仍然是File。
在SQL Server中,File Group和Partition Scheme統稱為Data Sapce(數據空間),默認的Data Space是Primary,即主文件組。
一,新建分區表分為三步
Step1, 創建分區函數
分區函數的作用是提供分區字段的類型和分區的邊界值,進而決定分區的數量
CREATE PARTITION FUNCTION [pf_int](int) AS RANGE LEFT FOR VALUES (10, 20)
分區函數pf_int 的含義是按照int類型分區,分區的邊界值是10,20,left表示邊界值屬於左邊界。兩個邊界值能夠分成三個分區,別是(-infinite,10],(10,20],(20,+infinite)。
Step2,創建分區架構(Scheme)
分區架構的作用是為Parition分配FileGroup,在邏輯上,Partition Scheme和FileGroup是等價的,都是數據存儲的邏輯空間,只不過Partition Scheme指定的是多個FileGroup。
CREATE PARTITION SCHEME [ps_int] AS PARTITION [pf_int] TO ([PRIMARY], [db_fg1], [db_fg1])
不管是在不同的FileGroup中,還是在相同的FileGroup中,分區都是獨立存儲的。
分區scheme的所有分區都存儲到相同的文件組中:
CREATE PARTITION SCHEME [ps_int] AS PARTITION [pf_int] ALL TO ([PRIMARY])
Step3,新建分區表
新建分區表,實際上是在創建Table時,使用on子句指定數據存儲的邏輯位置是分區架構(Partition Scheme)
create table dbo.dt_test ( ID int, code int ) on [ps_int] (id)
二,查看分區編號(Partition Number)
分區編號(Partition Number) 從1開始,從最左邊的分區向右依次遞增+1,邊界值最小的分區編號是1,
例如,對於以下分區函數:
CREATE PARTITION FUNCTION pf_int_Left (int) AS RANGE LEFT FOR VALUES (10,20);
分區的邊界值(Boundary Value)是10,20, 邊界值屬於左邊界(Range Left),該分區函數 pf_int_Left 划分了三個分區(Partition),范圍區間是:(-infinite,10], (10,20], (20,+infinite),(小括號表示不包括邊界值,中括號表示包括邊界值),系統分配的分區編號分別是:1,2,3。用戶可以通過使用$Partition函數 查看分區編號,調用語法格式是:
$Partition.Partition_Function(Partition_Column_Value)
例如,通過$Partition函數 查看分區列值為21時,該行數據所在的分區編號:
select $Partition.pf_int_left(21)
由於分區列值是21, 屬於范圍(20,+infinite),因此分區編號是:3。
參考文檔: