(3)SQL Server表分割槽
1.簡介
當一個表資料量很大時候,很自然我們就會想到將表拆分成很多小表,在執行查詢時候就到各個小表去查,最後彙總資料集返回給呼叫者加快查詢速度。比如電商平臺訂單表,庫存表,由於長年累月讀寫較多,積累資料都是異常龐大的,這時候,我們可以想到表分割槽這個做法,降低運維和維護成本,提高讀寫效能。比如將前半年訂單放一個歷史分割槽表,不活躍庫存放一個歷史分割槽表。截止到SQL Server 2016,一張表或一個索引最多可以有15000個分割槽。
2.表分割槽
2.1分割槽範圍
分割槽範圍是指在要分割槽的表中,根據業務選擇表中的關鍵欄位做為分割槽邊界條件,分割槽後,資料所在的具體位置至關重要,這樣才能在需要時只訪問相應的分割槽。注意分割槽是指資料的邏輯分離,不是資料在磁碟上的物理位置,資料的位置由檔案組來決定,所以一般建議一個分割槽對應一個檔案組。
2.2分割槽鍵
分割槽表中的欄位可以作為分割槽鍵,比如庫存表中供應商ID。對錶和索引進行分割槽的第一步就是定義分割槽的關鍵資料。
2.3索引分割槽
除了對錶的資料集進行分割槽之外,還可以對索引進行分割槽,使用相同的函式對錶及其索引進行分割槽通常可以優化效能。
3.建立表分割槽
3.1建立檔案組
在這裡演示示例當中,我根據業務場景在TestDB資料庫新增三個檔案組,而三個檔案組分別對應三個分割槽。而多個檔案組好處是可以按照不同業務場景將資料放在對應檔案組當中,優化效能同時好維護資料。檔案組數量由硬體決定,最好是一個檔案組對應一個分割槽,好維護。而通常檔案組都處於不同磁碟上的,但是由於是演示,我只在一個磁碟中存放。
--建立四個檔案組 ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup1 ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup2 ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup3
3.2指定檔案組存放路徑
在建立檔案組之後,指定檔案組存放磁碟位置,檔案大小。
--建立四個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):
ALTER DATABASE [TestDB] REMOVE FILE SupIDGroupFile3
可以通過以下T-SQL語句檢視檔案組存放相關資訊:
SELECT file_id,type,type_desc,data_space_id,name,physical_name,state_desc,size,growth FROM sys.database_files
3.3建立分割槽函式
如何建立表分割槽邊界值,我們肯定要根據業務場景來決定。比如我測試庫庫存表有36萬左右資料,而有些供應商的庫存資料遠遠比其他供應商大,那麼我可以考慮使用供應商ID欄位作為邊界值分割槽。例如:根據T-SQL統計,18080供應商庫存資料最大,那麼我可以根據18080供應商上下分為三個區。
第一個分割槽範圍記錄:供應商ID小於等於13570的39097條庫存資料。
第二個分割槽範圍記錄:供應商ID大於13570和小於等於18079的45962條庫存資料。
第三個分割槽範圍記錄:供應商ID大於18079小於等於18080的164937條庫存資料。
第四個分割槽範圍記錄:供應商ID大於18080的111116條庫存資料。
根據上述分割槽範圍記錄,我們可以將供應商ID作為邊界值設定,執行以下T-SQL語句設定邊界值:
--設定邊界值 CREATE PARTITION FUNCTION PF_SupplierID(int) AS RANGE LEFT FOR VALUES (13570,18079,18080)
執行完畢後如圖所示:
3.4建立分割槽方案
執行以下T-SQL語句建立分割槽方案:
--建立分割槽方案 CREATE PARTITION SCHEME PS_SupplierID AS PARTITION PF_SupplierID TO ([PRIMARY], [SupIDGroup1],[SupIDGroup2],[SupIDGroup3])
執行完畢後如圖所示:
3.5建立分割槽表
上面那些分割槽步驟都是為了接下來建立分割槽表這一步驟而準備的。廢話不多說,現在我們來看看如何建立分割槽表。右鍵需要分割槽的表->儲存->建立分割槽,具體步驟如下圖所示:
3.6建立分割槽索引
--建立分割槽索引 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
最後我們來看看加了索引之後表資料查詢情況:
4.表分割槽的優缺點
優點:
●改善查詢效能:對分割槽物件的查詢可以僅搜尋自己關心的分割槽,提高檢索速度。
●增強可用性:如果表的某個分割槽出現故障,表在其他分割槽的資料仍然可用。
●維護方便:如果表的某個分割槽出現故障,需要修復資料,只修復該分割槽即可。
●均衡I/O:可以把不同的分割槽對映到不同磁碟以平衡I/O,改善整個系統性能。
缺點:
分割槽表相關:已經存在的表沒有方法可以直接轉化為分割槽