通常情況下,我們建立的表都是未分割槽的表,或者說,只有乙個分割槽的表,資料只能儲存在乙個檔案組(file group)中,預設情況下,表資料儲存在primary檔案組。對錶進行分割槽後,每乙個分割槽都獨立儲存在檔案組(file group)中。把錶分割槽,實際上是把邏輯上完整的表,按照特定的字段拆分成多個分割槽,每個分割槽分配到(相同或不同的)filegroup中,每乙個分割槽在檔案組中都是獨立儲存,即使多個分割槽分配到相同的檔案組中。
為什麼要對資料表(table)分割槽?這是因為分割槽(partition)之間是物理上獨立儲存的,對單個分割槽進行操作,不會影響其他分割槽,這能提高查詢效能,避免死鎖;而分割槽切換甚至能夠不移動資料,而刪除海量資料。
一,建立分割槽表
在建立表時,使用on 子句指定儲存的邏輯位置:
create table [schema_name . ]table_name分割槽是表的邏輯儲存空間,而分割槽的物理儲存空間是由filegroup指定的,filegroup是file的集合,每乙個file都屬於唯一的filegroup。把錶的儲存空間分割到不同的filegroup中,邏輯上是將table的儲存管理體系增加了一層 partition,介於table和filegroup中間,table的資料儲存在partition,partition儲存在filegroup中,filegroup管理著file,file是實際儲存data的物理檔案。( >)
[on ]
二:建立分割槽表的步驟
step1, 建立分割槽函式
分割槽函式的作用是提供分割槽欄位的型別和分割槽的邊界值
create partition functionpf_int 的含義是按照int型別分割槽,分割槽的邊界值是10,20,left表示邊界值屬於左邊界。兩個邊界值能夠分成三個分割槽,別是(-infinite,10],(10,20],(20,+infinite)。[pf_int
](int
) as range left
forvalues (10, 20)
step2,建立分割槽scheme
分割槽scheme的作用是為parition分配filegroup,partition scheme和filegroup在邏輯上等價,都是資料儲存的邏輯空間,只不過partition scheme指定的是多個filegroup。
create partition scheme [不管是在不同的filegroup中,還是在相同的filegroup中,分割槽都是獨立儲存的。ps_int
]as partition [
pf_int
]to ([
primary
], [
db_fg1
], [
db_fg1
])
step3,建立分割槽表
建立分割槽表,實際上是使用on子句指定table儲存的邏輯位置。
create二,檢視分割槽表的元資料分割槽表的元資料是指分割槽函式,分割槽scheme,分割槽邊界值,分割槽對應的檔案組,這些元資料都能從sql server提供的系統檢視中檢視。table
dbo.dt_test
( id
int,
code
int)on[
ps_int
] (id)
1,檢視分割槽函式
使用系統檢視:sys.partition_functions 檢視當前資料庫中建立的分割槽函式,使用sys.partition_range_values 檢視每個分割槽的邊界值,使用sys.partition_parameters檢視分割槽函式的引數,分割槽函式的引數是分割槽表的分割槽列,分割槽列是什麼不重要,重要的是分割槽列的資料型別,如下圖,分割槽函式的id是65536,引數的系統型別system_type_id是56:
從sys.types檢視對應的資料型別,型別名稱是int,這說明分割槽列的資料型別必須是int:
2,檢視分割槽架構(scheme)
使用系統檢視:sys.partition_schemes 檢視分割槽函式對應的分割槽schema,
分割槽架構和檔案組統稱為資料空間(data space),data_space_id 是資料空間的id,每乙個parition scheme都有乙個唯一的id,每乙個檔案組都有乙個唯一的資料空間id。
從sys.filegroups中檢視檔案組的資料空間id:
從系統檢視:sys.data_spaces 檢視資料庫中的資料空間,可以看到 sys.data_spaces 是sys.filegroups 和 sys.partition_schemes 結果的並集,這說明,partition scheme和filegroup都是資料儲存的邏輯空間。
3,用於儲存分割槽的檔案組
乙個partition scheme能夠使用多個filegroup儲存資料,同時乙個filegroup可以被多個partition scheme使用,partition scheme和filegroup 之間的關係是many-to-many,sql server使用 sys.destination_data_spaces 顯示partition scheme和filegroup 之間的關係。
該檢視只有三列,顯示分割槽,檔案組和分割槽架構之間的對映:
4,檢視分割槽的資訊
通過sys.partitions 檢視每個索引的分割槽資訊,如果 index=0,表示資料表是乙個堆表;如果index=1,表示資料表上建立了聚集索引。rows:分割槽包含的資料行數目。data_compression和data_compression_desc 用於表示分割槽使用的資料壓縮型別。
5,檢視分割槽的統計資訊
使用 sys.dm_db_partition_stats 檢視分割槽的統計資料
三,檢視資料表使用的資料空間
系統檢視:sys.indexes 包含乙個字段 data_space_id,用於指定村粗索引資料的資料空間(data space),資料空間是乙個檔案組或分割槽架構(partition scheme)。兩個特殊的index_id,如果index_id=0,表明資料表是乙個堆表;如果index_id=1,表明資料表上已經建立聚集索引。資料表上的index_id要麼存在1,要麼是0,不可能同時存在,實際上,index_id=0 或1, 是資料表本身,而資料表本身要麼沒有建立聚集索引(堆表結構),要麼建立聚集索引(b-tree結構)。
select object_schema_name(t.object_id) +'.sys.data_spaces (transact-sql)'+ t.name as
table_name
,ds.name
asdata_space
,ds.data_space_id
,ds.type_desc
asdata_space_type
,ds.type
from
sys.indexes i
inner
join
sys.tables t
on i.object_id
=t.object_id
and t.type='u
'inner
join
sys.data_spaces ds
on i.data_space_id=
ds.data_space_id
where i.index_id<=
1
Greenplum 分割槽表介紹
greenplum 分割槽表 greenplum分割槽表的原理和postgresql的原理相同,都是把一張大表進行按照適合的維度進行分割,通過表的繼承,規則,約束實現的。在greenplum中,乙個表是否分割槽表儲存在pg partition中.gp在建表的時候會有乙個distributed by選...
把非分割槽表改為分割槽表
把非分割槽表改為分割槽表 說明 把非分割槽表改為分割槽表適用於歷史表 1 建立分割槽表 結構和非分割槽表tbl stock balance log相同 createtabletbl stock balance log part1 account id varchar2 20 byte occur d...
Mysql分割槽表 介紹和使用
你有一張表,儲存引擎為innodb,裡面儲存的資料量達到了上億級別。此時,因為資料量巨大,肯定不能在每次查詢的時候都掃瞄全表。就算是使用索引 b tree 除非使用索引覆蓋查詢,否則資料庫伺服器需要根據查詢的結果回表,查詢所有符合條件的資料,如果資料量巨大,會產生大量的隨機io,最終使得應用程式僵死...