一、分區表概念
1.1、什么是分區表?
分區表是在SQL Server 2005之后的版本引入的特性,這個特性允許把邏輯上的一個表在物理上分為很多部分。換句話說,分區表從物理上看是將一個大表分成幾個小表,但是從邏輯上看,還是一個大表。
1.2、分區與分表的區別
分區:就是把一張表的數據分成N個區塊,從邏輯上看只是一張表,但底層是由N個物理區塊組成的。
分表:就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。
1.3、水平分表與垂直分表的區別
水平分表:將一張表中的數據分成多個表且表結構不變。
垂直分表:將一張表按照字段分成不同表且表結構發生改變。
二、分區表優點
2.1、使用多個文件分布數據到多個硬盤中,可以極大地提高IO性能。
2.2、多個文件對於數據略多的數據庫來說,備份和恢復都會輕松很多。
三、分區表場景
3.1、數據庫中某個表的數據量很大,在查詢數據時會明顯感覺到速度很慢,這種情況可以考慮分區表。
3.2、數據是分段的,如以年份為分隔的數據,對於當前的數據經常進行增刪改查操作,而對於往年的數據幾乎不做操作或只做查詢操作,這種情況可以考慮分區表。
3.3、對數據的操作如果只涉及一部分數據而非全部數據,這種情況可以考慮分區表。
3.4、如果一張表的數據經常進行增刪改查操作,而不管年份之類的因素,這種情況最好不要考慮分區表。
四、分區表創建
4.1、創建步驟
創建分表區的步驟分為5步:
1)創建數據庫文件組
2)創建數據庫文件
注:應將文件組和文件存放於不同的硬盤甚至不同的服務器中,因為數據的讀取瓶頸很大程度在於硬盤的讀寫速度,多個硬盤存儲一個表可以實現負載均衡。
3)創建分區函數
注:聲明分區的標准。
4)創建分區方案
注:即哪些區域使用哪個分區函數,形成完整的分區方案。
5)創建分區表
4.2、創建實操
背景:現以表Sales.SalesOrderHeader作為示例,此表有2011-2014年的數據。
分區:按年進行分區,此表有2011、2012、2013、2014等4個邊界值,需要5個分區,分別是2011前、2011、2012、2013、2013后。
描述:分區表的數據存放於分區文件(數據庫ndf文件)中;分區文件存放於分區文件組中;分區文件組存放於多個硬盤中。
1)對着數據庫點擊"右鍵"->"屬性"。
2)點擊"文件組"->"添加文件組"->分別建立FG2011BF、FG2011、FG2012、FG2013、FG2013AF等5個文件組->"確定"。
3)點擊"文件"->"添加"->分別建立FL2011BF、FL2011、FL2012、FL2013、FL2013AF等5個文件->選擇對應的文件組及存放路徑->"確定"。
4)對着表Sales.SalesOrderHeader點擊"右鍵"->"存儲"->"創建分區"->"下一步"。
5)分區列選擇"OrderDate"->勾選"將存儲區中的所有非唯一索引和唯一索引與索引分區列對齊"->點擊"下一步"。
6)起個分區函數名如"SalesOrderHeader_OrderDate"->點擊"下一步"。
7)起個分區方案名如"SalesOrderHeader_OrderDate"->點擊"下一步"。
8)映射分區范圍選擇"左邊界"->點擊"設置邊界"->開始日期:"2011/01/01"、結束日期:"2014/01/01"、日期范圍:"年"->點擊"確定"。
9)依邊界值選擇相對應的文件組->點擊"預計存儲空間"可查看行計數及空間信息->點擊"下一步"。
10)選擇"立即運行"->點擊"下一步"->點擊"完成"。
五、分區表檢查
5.1、檢查分區函數與分區方案
5.2、檢查分區文件
六、分區表查詢
6.1、查看分區及行計數
SELECT CONVERT(VARCHAR(50),A.NAME) Partition_Scheme,D.Partition_Number,CONVERT(VARCHAR(10),E.NAME) FileGroup, CONVERT(VARCHAR(19),ISNULL(G.VALUE,''),120) Range_Boundary,STR(D.ROWS,9) Rows FROM SYS.PARTITION_SCHEMES A INNER JOIN SYS.DESTINATION_DATA_SPACES B ON A.DATA_SPACE_ID=B.PARTITION_SCHEME_ID INNER JOIN SYS.INDEXES C ON A.DATA_SPACE_ID=C.DATA_SPACE_ID INNER JOIN SYS.PARTITIONS D ON B.DESTINATION_ID=D.PARTITION_NUMBER AND C.OBJECT_ID=D.OBJECT_ID AND C.INDEX_ID=D.INDEX_ID INNER JOIN SYS.DATA_SPACES E ON B.DATA_SPACE_ID=E.DATA_SPACE_ID INNER JOIN SYS.PARTITION_FUNCTIONS F ON A.FUNCTION_ID=F.FUNCTION_ID LEFT JOIN SYS.PARTITION_RANGE_VALUES G ON F.FUNCTION_ID=G.FUNCTION_ID AND D.PARTITION_NUMBER-F.BOUNDARY_VALUE_ON_RIGHT=G.BOUNDARY_ID WHERE C.OBJECT_ID=OBJECT_ID('SALES.SALESORDERHEADER') --分區表名 AND C.INDEX_ID IN (0,1) ORDER BY Partition_Scheme,D.Partition_Number
6.2、查看文件及文件組
SELECT A.[NAME],A.PHYSICAL_NAME,A.[SIZE],A.GROWTH,B.[NAME] [FILEGROUP],B.IS_DEFAULT FROM SYS.DATABASE_FILES A INNER JOIN SYS.FILEGROUPS B ON A.DATA_SPACE_ID=B.DATA_SPACE_ID