咱們知道不少事情都存在一個分治的思想,一樣的道理咱們也能夠用到數據表上,當一個表很大很大的時候,咱們就會想到將表拆sql
分紅不少小表,查詢的時候就到各個小表去查,最後進行彙總返回給調用方來加速咱們的查詢速度,固然切分可使用橫向切分,縱向數據庫
切分,好比咱們最熟悉的訂單表,一般會將三個月之外的訂單放到歷史訂單表中,這裏的三個月就是將訂單表進行切分的依據。服務器
好了,分區表的好處我想你們都很清楚了,下面咱們看看如何實現。架構
一:分區表函數
這裏咱們作個例子,建立一個test數據庫,表名爲shop,以createtime做爲分區依據。測試
1:肯定分區依據spa
怎麼分區的話,這個要看具體業務邏輯了,你能夠按照時間,地區,求模等等均可以。3d
2:建立文件組code
既然是文件組,確定是對文件進行分類管理的,默認狀況下就一個mdf和ldf文件,當全部的數據都擠壓在mdf上,確實不是一個blog
很好的事情,下降咱們的查詢速度,當用到文件組的時候就能夠建立多個ndf來分攤mdf中的數據,甚至還能夠將ndf分攤到幾個磁盤
上,充分利用服務器多核處理能力,說了這麼多,咱們看看sql語句咋搞,這裏我建立四個文件組,分別存放2013以前,2013,2014
和2014年以後的數據。
1 alter database Test add filegroup Before2013 2 alter database Test add filegroup T2013 3 alter database Test add filegroup T2014 4 alter database Test add filegroup After2014
3:建立文件
根據上面在文件組上的概述,文件的做用你們都知道了,這裏咱們要作的是,將次文件.ndf附加到文件組上,由於我建立了4個文件組,
因此我也建立4個文件分別存放在這4個文件組中。
1 alter database Test add file 2 (Name=N'Before2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Before20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 3 to filegroup Before2013 4 alter database Test add file 5 (Name=N'T2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 6 to filegroup T2013 7 alter database Test add file 8 (Name=N'T2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 9 to filegroup T2014 10 alter database Test add file 11 (Name=N'After2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) 12 to filegroup After2014
4:編寫分區函數
剛纔也說了,咱們是按照時間進行切分的,將數據表數據分紅:
① 2013年以前
② 2013-2014
③ 2014-2015
④ 2015以後
既然都知道依據了,咱們分區函數也方便寫了。
1 create partition function RangeTime (datetime) 2 as range left for values ('2012-12-31','2013-12-31','2014-12-31')
從上面的sql,咱們能夠看到三個點將時間軸分紅了4段
第一:rangeTime 爲分組函數名。
第二:left 其實就是當時間點在邊界時到底屬於左側仍是右側,由於這裏是left,因此屬於左側,若是是right關鍵詞,那就屬於右側了。
5:編寫分區方案
分區方案也就是將分區函數與文件組進行一個關聯,剛纔也說了,3個時間點將一個時間軸分紅了4部分,恰好對應了4個文件組。
那麼具體的sql寫法以下:
1 create partition scheme RangeSchema_CreateTime 2 as partition RangeTime 3 to (before2013,T2013,T2014,after2014)
6:建立分區表
跟普通表建立有點不同,分區表的建立還須要指定這個分區須要使用哪一個分區方案下的分區字段,那麼這裏就是RangeSchema_CreateTime
中的CreateTime字段。
1 create table Shop 2 ( 3 ID varchar(50), 4 ShopName varchar(50), 5 CreateTime datetime 6 ) on RangeSchema_CreateTime(CreateTime)
這裏要注意,若是在建立表的時候指定了ID爲主鍵的話,這個時候須要指定ID爲分區字段,不然會報錯的。
這時候能夠在不要主鍵的狀況下先建立表,而後再指定ID爲主鍵。
7:插入測試數據並統計
這裏我先插入10w條數據,而後來看看數據在各個分區的狀況。‘
<1>插入數據
<2> 統計每一個分區的數據量
這裏主要有一個查詢分區的關鍵字「$partition」,很是的有用。
好了,到這個咱們經過sql語句來實現分區表就已經完成了。
二:使用管理界面建立分區表
1:首先咱們建立test1數據庫和shop表
2:建立文件組和文件
3:建立分區
①:右鍵Shop表,彈出菜單中選擇 「存儲」 => "建立分區"
②:建立「分區函數」名 和 「分區方案」名。
③:建立分區映射,也就是將」分區函數「和「文件組」進行關聯。
④: 最後咱們能夠看一下界面給我生成的分區函數以及分區方案,蠻有意思的。
1 USE [Test1] 2 GO 3 BEGIN TRANSACTION 4 CREATE PARTITION FUNCTION [MyRangeCreatTime](datetime) AS RANGE LEFT FOR VALUES (N'2012-12-31T00:00:00', N'2013-12-31T00:00:00', N'2014-12-31T00:00:00') 5 6 7 CREATE PARTITION SCHEME [MySchemeCreateTime] AS PARTITION [MyRangeCreatTime] TO ([Before2013], [T2013], [T2014], [After2014]) 8 9 10 ALTER TABLE [dbo].[Shop] DROP CONSTRAINT [PK__Shop__3214EC277F60ED59] 11 12 13 ALTER TABLE [dbo].[Shop] ADD PRIMARY KEY NONCLUSTERED 14 ( 15 [ID] ASC 16 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 17 18 19 CREATE CLUSTERED INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] 20 ( 21 [CreateTime] 22 )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [MySchemeCreateTime]([CreateTime]) 23 24 25 DROP INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] WITH ( ONLINE = OFF ) 26 27 28 29 30 COMMIT TRANSACTION
從圖中能夠看到生成好的分區函數名」[MyRangeCreatTime]「 和分區架構名「[MySchemeCreateTime]」,最後咱們執行下該sql就ok了。
⑤ 插入測試數據並進行簡單的測試
這裏測試下「2013-1-1」是在哪一個分區下。