什么是表分區(qū)?表分區(qū)其實(shí)就是將一個大表分成若干個小表。表分區(qū)可以從物理上將一個大表分成幾個小表,但是邏輯上還是一個表。所以當(dāng)執(zhí)行插入、更新等操作的時候,不需要我們?nèi)ヅ袛鄳?yīng)該插入或更新到哪個表中。只需要插入大表中就可以了。SQL Server會自動的將它放在對應(yīng)的表中。對于查詢也是一樣,直接查詢大表就可以了。
如何創(chuàng)建分區(qū)表
一、創(chuàng)建文件組
其實(shí)可以使用默認(rèn)的PRimary組,但是為了更方便管理以及提高運(yùn)行速度,所以還是應(yīng)該創(chuàng)建幾個分組。
1、使用SSMS創(chuàng)建文件組
2、使用T-SQL創(chuàng)建文件組
--alter database <數(shù)據(jù)庫名> add filegroup <文件組名>alter database webDB add filegroup group2013alter database webDB add filegroup group2014alter database webDB add filegroup group2015
二、為文件組添加數(shù)據(jù)庫文件
1、使用SSMS添加數(shù)據(jù)庫文件
2、使用T-SQL添加數(shù)據(jù)庫文件
--alter database <數(shù)據(jù)庫名稱> add file <數(shù)據(jù)標(biāo)識> to filegroup <文件組名稱>alter database webDB add file( name='web2013', filename='D:/web2013.ndf', size=5mb, filegrowth=5mb)to filegroup group2013alter database webDB add file( name='web2014', filename='D:/web2014.ndf', size=5mb, filegrowth=5mb)to filegroup group2014alter database webDB add file( name='web2015', filename='D:/web2015.ndf', size=5mb, filegrowth=5mb)to filegroup group2015
注意:盡可能的將不同的文件放在不同的硬盤分區(qū)里,或者獨(dú)立硬盤中。這樣可以加快SQL Server運(yùn)行速度。
三、創(chuàng)建分區(qū)函數(shù)
分區(qū)函數(shù)用來告訴SQLServer用什么樣的規(guī)則進(jìn)行分區(qū),這一步必須使用T-SQL腳本來執(zhí)行了。
create partition function fenqu(datetime) --分區(qū)函數(shù)名as range right --right分區(qū)方式 邊界值去左表還是右表for values ('2014-01-01','2015-01-01') --按這些值來分區(qū) --group2013 : 2014-01-01 之前的--group2014 : 2014-01-01 到 2014-12-31的--group2015 : 2015-01-01 之后的
四、創(chuàng)建分區(qū)方案
create partition scheme SchemeFenqu --分區(qū)方案名as partition fenqu --之前創(chuàng)建的分區(qū)函數(shù)to(group2013,group2014,group2015) --跟放的文件組
創(chuàng)建完分區(qū)函數(shù)和分區(qū)方案后可以在存儲中查看
五、創(chuàng)建分區(qū)表
create table fenquTable( id int identity(1,1) not null, name varchar(20) not null, createTime datetime not null) on SchemeFenqu(createTime) --調(diào)用分區(qū)方案
注意:不可以使用聚集索引,因?yàn)榫奂饕谴嬖谶B續(xù)的物理地址中的,而表分區(qū)是將數(shù)據(jù)分別存儲在不同表中的。
至此物理上分離的,邏輯上一體的分區(qū)表就創(chuàng)建完了。
操作分區(qū)表
一、插入數(shù)據(jù)
--插入測試數(shù)據(jù)insert into fenquTable(name,createTime) values ('隔壁老王','2010-01-01')insert into fenquTable(name,createTime) values ('隔壁老張','2011-01-01')insert into fenquTable(name,createTime) values ('隔壁老趙','2012-01-01')insert into fenquTable(name,createTime) values ('隔壁老李','2013-01-01')insert into fenquTable(name,createTime) values ('老李兒子','2013-10-01')insert into fenquTable(name,createTime) values ('隔壁老田','2014-01-01')insert into fenquTable(name,createTime) values ('隔壁老梁','2015-01-01')insert into fenquTable(name,createTime) values ('老梁姑娘楠楠','2015-10-10')
跟插入普通表沒有任何區(qū)別,不用管他放在哪個物理磁盤上。
二、查詢數(shù)據(jù)
--查詢數(shù)據(jù)select * from fenquTable
查詢也是如此,不用考慮哪個磁盤,邏輯上都屬于同一個表,基本上看不出區(qū)別。如果需要查看哪條插入到哪個物理的分區(qū)表中,可以使用$partition函數(shù)查看。
--語法:$partition.分區(qū)函數(shù)名(表達(dá)式)--查看該表達(dá)式下有多少數(shù)據(jù)select $partition.fenqu('2015-01-01') --返回3--查看分區(qū)表明細(xì)select * from fenquTable where $partition.fenqu(createTime)=1select * from fenquTable where $partition.fenqu(createTime)=2select * from fenquTable where $partition.fenqu(createTime)=3--查看分區(qū)表中的記錄數(shù)select $partition.fenqu(createTime) as 分區(qū) ,count(id) from fenquTable group by $partition.fenqu(createTime)
三、修改數(shù)據(jù)
select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量 from fenquTablegroup by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 5--2 1--3 2update fenquTable set createTime ='2015-01-01' where id = 1select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量 from fenquTablegroup by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 4--2 1--3 3
可以明顯看到,跟普通修改沒有區(qū)別,SQLServer可以自動幫我們重新劃分分區(qū),將數(shù)據(jù)從第一個分區(qū)移動到第五個分區(qū)中。
普通表轉(zhuǎn)分區(qū)表
上面介紹了如何在創(chuàng)建表的時候進(jìn)行分區(qū),但往往我們需要的是將現(xiàn)有的普通表在數(shù)據(jù)保留的情況下進(jìn)行分區(qū)。
普通表一般都有主鍵,同時還是聚集索引。分區(qū)是以某個字段為條件進(jìn)行的,而除了這個字段其他字段是不可以創(chuàng)建聚集索引的。所以需要先刪除表中的聚集索引,再新建一個聚集索引。
--刪除主鍵,自動同時刪除索引alter table newTable drop constraint PK_newTable --創(chuàng)建主鍵,但不創(chuàng)建聚集索引alter table newTable add constraint PK_newTableprimary key nonclustered --非聚集( id asc) on [primary]--然后給我們親愛的時間創(chuàng)建一個聚集索引create clustered index CT_newTable on newTable(createTime)on schemeFenqu(createTime) --并調(diào)用分區(qū)方案--然后再查詢分區(qū),發(fā)現(xiàn)數(shù)據(jù)保留情況下,已經(jīng)將數(shù)據(jù)按規(guī)則進(jìn)行分區(qū)了select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)
添加分區(qū)
向上面只分了3個區(qū),而15年以后的都存在第三個分區(qū)中,到16年還是會存在這個分區(qū)中,這時候需要再新加一個16年的分區(qū)。
添加新的分區(qū)意味著要新建一個文件組和文件來存放這個分區(qū)表,然后在分區(qū)方案中用到這個文件組,最后再修改一下分區(qū)函數(shù)的規(guī)則即可。文件組和分區(qū)數(shù)量要保持一致。
--創(chuàng)建文件組alter database webDB add filegroup group2016--添加數(shù)據(jù)庫文件alter database webDB add file( name='web2016', filename='D:/web2016.ndf', size=5mb, filegrowth=5mb)to filegroup group2016--修改分區(qū)方案alter partition scheme SchemeFenqunext used group2016--修改分區(qū)函數(shù)alter partition function fenqu()split range('2016-01-01')--添加2016年數(shù)據(jù)insert into newTable (name,createTime) values ('16年小明','2016-03-05')--查看分區(qū)及統(tǒng)計(jì)select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)
刪除分區(qū)
刪除分區(qū)就是將分區(qū)函數(shù)中多余的邊界值刪除。
如:2013,2014,2015,2016現(xiàn)在需要將13年和14年進(jìn)行合并,刪除13年的分區(qū)。
--查看分區(qū)及統(tǒng)計(jì)select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 4--2 1--3 3--4 1--刪掉該邊界值alter partition function fenqu() merge range('2014-01-01')--再次查詢select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 5--2 3--3 1
拆分分區(qū)
有的時候某一分區(qū)中數(shù)據(jù)量過大,需要將這個分區(qū)再次拆分為多個分區(qū),以加快訪問速度。
拆分分區(qū)的操作其實(shí)與添加分區(qū)類似,首先要添加文件組、文件、修改分區(qū)方案、修改分區(qū)函數(shù)(新增一個邊界值)。
如:2014,2015,2015年6月份以上一個 6月份一下一個。
--查看分區(qū)及統(tǒng)計(jì)select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 5--2 3--3 1--創(chuàng)建文件組alter database webDB add filegroup group2014_2015--添加數(shù)據(jù)庫文件alter database webDB add file( name='web2014_2015', filename='D:/web2014_2015.ndf', size=5mb, filegrowth=5mb)to filegroup group2014_2015--修改分區(qū)方案alter partition scheme SchemeFenqunext used group2014_2015--修改分區(qū)函數(shù)alter partition function fenqu()split range('2015-06-01')--查看分區(qū)及統(tǒng)計(jì)select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)--分區(qū) 數(shù)量--1 5--2 2--3 1--4 1
分區(qū)表轉(zhuǎn)普通表
--修改分區(qū)函數(shù) 將邊界值都刪除alter partition function fenqu()merge range('2013-01-01')alter partition function fenqu()merge range('2014-01-01')alter partition function fenqu()merge range('2015-01-01')alter partition function fenqu()merge range('2015-06-01')select $partition.fenqu(createTime) as 分區(qū),count(id) as 數(shù)量from newTable group by $partition.fenqu(createTime)--這時只有一個分區(qū)了--分區(qū) 數(shù)量--1 9
這樣雖然只有一個分區(qū)了,但是查看數(shù)據(jù)表存儲位置,是否進(jìn)行分區(qū):True,分區(qū)數(shù)1.
--重新建立聚集索引create clustered index CT_newTable on newTable(createTime) with(drop_existing=on) --如果存在則刪除on [primary]
刪除分區(qū)索引后,重新建立聚集索引,這時再此查看數(shù)據(jù)表的存儲位置,是否分區(qū):Flase。
新聞熱點(diǎn)
疑難解答
圖片精選