當一個表數據量很大時候,很天然咱們就會想到將表拆分紅不少小表,在執行查詢時候就到各個小表去查,最後彙總數據集返回給調用者加快查詢速度。好比電商平臺訂單表,庫存表,因爲終年累月讀寫較多,積累數據都是異常龐大的,這時候,咱們能夠想到表分區這個作法,下降運維和維護成本,提升讀寫性能。好比將前半年訂單放一個歷史分區表,不活躍庫存放一個歷史分區表。截止到SQL Server 2016,一張表或一個索引最多能夠有15000個分區。數據庫
分區範圍是指在要分區的表中,根據業務選擇表中的關鍵字段作爲分區邊界條件,分區後,數據所在的具體位置相當重要,這樣才能在須要時只訪問相應的分區。注意分區是指數據的邏輯分離,不是數據在磁盤上的物理位置,數據的位置由文件組來決定,因此通常建議一個分區對應一個文件組。運維
分區表中的字段能夠做爲分區鍵,好比庫存表中供應商ID。對錶和索引進行分區的第一步就是定義分區的關鍵數據。函數
除了對錶的數據集進行分區以外,還能夠對索引進行分區,使用相同的函數對錶及其索引進行分區一般能夠優化性能。性能
在這裏演示示例當中,我根據業務場景在TestDB數據庫新增三個文件組,而三個文件組分別對應三個分區。而多個文件組好處是能夠按照不一樣業務場景將數據放在對應文件組當中,優化性能同時好維護數據。文件組數量由硬件決定,最好是一個文件組對應一個分區,好維護。而一般文件組都處於不一樣磁盤上的,可是因爲是演示,我只在一個磁盤中存放。測試
--建立四個文件組
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup1
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup2
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup3
在建立文件組以後,指定文件組存放磁盤位置,文件大小。優化
--建立四個ndf文件,對應到各文件組中,FILENAME文件存儲路徑 ALTER DATABASE [TestDB] ADD FILE( NAME='SupIDGroupFile1', FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile1.ndf', SIZE=10MB, FILEGROWTH=10MB) TO FILEGROUP SupIDGroup1 ALTER DATABASE [TestDB] ADD FILE( NAME='SupIDGroupFile2', FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile2.ndf', SIZE=10MB, FILEGROWTH=10MB) TO FILEGROUP SupIDGroup2 ALTER DATABASE [TestDB] ADD FILE( NAME='SupIDGroupFile3', FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile3.ndf', SIZE=10MB, FILEGROWTH=10MB) TO FILEGROUP SupIDGroup3
注(附上刪除文件組T-SQL):spa
ALTER DATABASE [TestDB] REMOVE FILE SupIDGroupFile3
能夠經過如下T-SQL語句查看文件組存放相關信息:3d
SELECT file_id,type,type_desc,data_space_id,name,physical_name,state_desc,size,growth
FROM sys.database_files
如何建立表分區邊界值,咱們確定要根據業務場景來決定。好比我測試庫庫存表有36萬左右數據,而有些供應商的庫存數據遠遠比其餘供應商大,那麼我能夠考慮使用供應商ID字段做爲邊界值分區。例如:根據T-SQL統計,18080供應商庫存數據最大,那麼我能夠根據18080供應商上下分爲三個區。
第一個分區範圍記錄:供應商ID小於等於13570的39097條庫存數據。
第二個分區範圍記錄:供應商ID大於13570和小於等於18079的45962條庫存數據。
第三個分區範圍記錄:供應商ID大於18079小於等於18080的164937條庫存數據。
第四個分區範圍記錄:供應商ID大於18080的111116條庫存數據。
根據上述分區範圍記錄,咱們能夠將供應商ID做爲邊界值設置,執行如下T-SQL語句設置邊界值:code
--設置邊界值 CREATE PARTITION FUNCTION PF_SupplierID(int) AS RANGE LEFT FOR VALUES (13570,18079,18080)
執行完畢後如圖所示:對象
執行如下T-SQL語句建立分區方案:
--建立分區方案
CREATE PARTITION SCHEME PS_SupplierID
AS PARTITION PF_SupplierID TO ([PRIMARY], [SupIDGroup1],[SupIDGroup2],[SupIDGroup3])
執行完畢後如圖所示:
上面那些分區步驟都是爲了接下來建立分區表這一步驟而準備的。廢話很少說,如今咱們來看看如何建立分區表。右鍵須要分區的表->儲存->建立分區,具體步驟以下圖所示:
--建立分區索引 CREATE NONCLUSTERED INDEX [NCI_SupplierID] ON dbo.Stock ( SupplierID ASC ) INCLUDE ( [Model],[Brand],[Encapsulation]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO
或者
執行完畢後如圖所示:
建立好索引以後,咱們來看看分區狀況:
--查看各分區有多少行數據 SELECT * FROM ( SELECT $PARTITION.PF_SupplierID([SupplierID]) AS Patition,COUNT(*) AS CountRows FROM dbo.Stock GROUP BY $PARTITION.PF_SupplierID([SupplierID]) )TB ORDER BY Patition
最後咱們來看看加了索引以後表數據查詢狀況:
優勢:
●改善查詢性能:對分區對象的查詢能夠僅搜索本身關心的分區,提升檢索速度。
●加強可用性:若是表的某個分區出現故障,表在其餘分區的數據仍然可用。
●維護方便:若是表的某個分區出現故障,須要修復數據,只修復該分區便可。
●均衡I/O:能夠把不一樣的分區映射到不一樣磁盤以平衡I/O,改善整個系統性能。
缺點:分區表相關:已經存在的表沒有方法能夠直接轉化爲分區表。