在sql server中,普通表可以轉化為分割槽表,而分割槽表不能轉化為普通表,普通表轉化成分割槽表的過程是不可逆的,將普通表轉化為分割槽表的方法是:
在分割槽架構(partition scheme)上建立聚集索引,就是說,將聚集索引分割槽。
資料庫中已有分割槽函式(partition function) 和分割槽架構(partition scheme):
view code
如果在普通表上存在聚集索引,並且聚集索引列是分割槽列,那麼重建聚集索引,就能使表轉化成分割槽表。聚集索引的建立有兩種方式:使用clustered 約束(primary key 或 unique約束)建立,使用 create clustered index 建立。
一,在分割槽架構(partition scheme)上,建立聚集索引
如果聚集索引是使用 create clustered index 建立的,並且聚集索引列就是分割槽列,使普通表轉換成分割槽表的方法是:刪除所有的 nonclustered index,在partition scheme上重建clustered index
1,表dbo.dt_partition的聚集索引是使用 create clustered index 建立的,
複製**
create table dbo.dt_partition
(id int,
code int
)create clustered index cix_dt_partition_id
on dbo.dt_partition(id)
複製**
2,從系統表partition中,檢視該錶的分割槽只有乙個
select *
from sys.partitions p
where p.object_id=object_id(n』dbo.dt_partition』,n』u』)
3,使用partition scheme,重建表的聚集索引
create clustered index cix_dt_partition_id
on dbo.dt_partition(id)
with(drop_existing=on)
on ps_int_left(id)
4,重建聚集索引之後,表的分割槽有三個
select *
from sys.partitions p
where p.object_id=object_id(n』dbo.dt_partition』,n』u』)
二,如果表的聚集索引是使用primary key clustered 來建立,並且primary key 就是分割槽列
在sql server中,不能修改約束,將普通表轉換成分割槽表,有兩種方式來實現,第一種方式是:在刪除clustered constraint 時,將資料移動到分割槽scheme上;第二種方式,刪除clustered constraint,在分割槽scheme上重建clustered constraint。
1,在刪除clustered 約束時,將資料移動到分割槽scheme上
使用 alter table drop constraint 命令,在刪除聚集索引時,將資料移動到指定的partition scheme上,此時該錶變成分割槽的堆表:
alter table schema_name . table_name
drop [ constraint ] constraint_name
[ with ( move to )]
move to 選項的作用是將table移動到新的location中,如果新的location 是partition scheme,那麼在刪除clustered 約束時,sql server將表資料移動到分割槽架構中,這種操作和使用 create table on partition scheme建立分割槽表的作用相同。
複製**
create table dbo.dt_partition_pk
(id int not null constraint pk__dt_partition_id primary key clustered ,
code int not null
)alter table dbo.dt_partition_pk
drop constraint pk__dt_partition_id
with( move to ps_int_left(id))
複製**
2,刪除clustered 約束,在partition scheme上重建clustered 約束
複製**
create table dbo.dt_partition_pk
(id int not null constraint pk__dt_partition_id primary key clustered ,
code int not null
)alter table dbo.dt_partition_pk
drop constraint pk__dt_partition_id
alter table dbo.dt_partition_pk
add constraint pk__dt_partition_id primary key clustered(id)
on ps_int_left(id);
複製**
三,將堆表轉換成分割槽表
使堆表轉換成分區,只需要在堆表上建立乙個分割槽的clustered index
複製**
create table dbo.dt_partition_heap
(id int not null,
code int not null
)create clustered index cix_partition_heap_id
on dbo.dt_partition_heap(id)
on ps_int_left(id)
複製**
四,普通表轉化成分割槽表的過程是不可逆的,普通表能夠轉化成分割槽表,而分割槽表不能轉化成普通表。
普通表儲存的location是filegroup,分割槽表儲存的location是partition scheme,在sql server中,儲存表資料的location叫做data space。通過在partition scheme上建立clustered index ,能夠將已經存在的普通表轉化成partition table,但是,將clustered index刪除,表仍然是分割槽表,轉化過程(將普通表轉換成分割槽表)是不可逆的,乙個partition table 是不能轉化成普通表的,即使通過合併分割槽,使partiton table 只存在乙個partition,這個表的仍然是partition table,這個table的data space 是partition scheme,而不會轉化成file group。
從 sys.data_spaces 中檢視data space ,共有兩種型別,分別是fg 和 ps。fg是file group,意味著資料表的資料儲存在file group分配的儲存空間,乙個table 只能存在於乙個filegroup中。ps 是partition scheme,意味著將資料分布式儲存在不同的file groups中,儲存資料的file group是根據partition column值的範圍來分配的。對於分割槽表,sql server從指定的file group分配儲存空間,雖然乙個table只能指定乙個partition scheme,但是其資料卻分布在多個file groups中,這些file groups由partition scheme指定,可以相同,也可以不同。
檢視table的data space,通過索引的data_space_id 欄位來檢視各個索引(聚集索引是表本身)資料的儲存空間:
複製**
select o.name as tablename,o.type_desc,
i.name as indexname,
i.index_id,i.type_desc,i.data_space_id,
ds.name as dataspacename,ds.type_desc
from sys.indexes i
inner join sys.objects o
on o.object_id=i.object_id
inner join sys.data_spaces ds
on i.data_space_id=ds.data_space_id
where i.object_id=object_id(n』[dbo].[dt_test_partition]』)
and i.index_id=0
複製**
在分割槽之前,檢視data_space是name是 primary file group
在分割槽之後,檢視table的 data space 是ps_int partition scheme
MySQL分表(Partition)學習研究報告
最近在開發乙個新的專案,可能會產生大資料量,需要對部分表進行分表操作,故來研究學習mysql的分表功能。以下是此次實驗的結論 insert時,分表和不分表的效能所差無幾 大量資料insert時,大量資料整合成一條sql的效能比逐個insert的效能提高很多 分表與否並不影響查詢操作,其返回的結果還是...
對現有Hive的大表進行動態分割槽
分割槽是在處理大型事實表時常用的方法。分割槽的好處在於縮小查詢掃瞄範圍,從而提高速度。分割槽分為兩種 靜態分割槽static partition和動態分割槽dynamic partition。靜態分割槽和動態分割槽的區別在於匯入資料時,是手動輸入分割槽名稱,還是通過資料來判斷資料分割槽。對於大資料批...
自測 2 素數對猜想 20分
includeint n,m,p int d int flag 0 int count 0 int main for m n m 4 m 2 if flag 0 if flag 0 flag 0 printf d count 上述 在最後乙個測試點顯示執行超時。分割線 include int a 1...