SQL Server高級進階之分區表創建


一、分區表概念

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年的數據。

分區:按年進行分區,此表有2011201220132014等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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM