SQL Server 2005 創建分區表
背景:隨著公司的業務迅猛發展,導致部分數據表的數據量劇增(T_ZK_C0075ALog、T_ZK_C007ALog),無法滿足用戶對查詢效率、性能的要求。
意義:在于將大數據從物理上切割為幾個相互獨立的小部分,從而在查詢時只取出其中一個或幾個分區,減少影響的數據;另外,對置于不同文件組的分區,并行查詢的性能也要高于對整個表的查詢性能。
事實上,在SQL Server 2005 中就已經包含了分區功能,甚至在2005之前,還存在一個叫做“Partitioned Views”的功能,能通過將同樣結構的表Union在一個View中,實現類似現在分區表的效果。而在SQL Server 2008 中,分區功能得到了顯著加強,使得我們不僅能夠對表和索引做分區,而且允許對分區上鎖,而不是之前的全表上鎖。
相關知識參考:
1、對于SQL SERVER中分區表的理解和相關理論知識,請參考文章:
2、對于SQL Server數據庫中,關于文件的存放方式,以及文件和文件組,請參考文章:
3、對于創建百萬或千萬級的測試數據表,建議采用 遞歸CTE插入。請參考文章:
SQL Server 2012中快速插入批量數據的示例及疑惑
創建分區表的步驟:
一、創建與刪除分區函數;
二、創建與刪除文件組;
三、創建與刪除文件;
四、創建與刪除分區架構;
五、查看分區是否成功;
一、創建與刪除分區函數
1.1、創建分區函數
CREATE PARTITION FUNCTION F_Partition_tzkc0075aLog_Range(datetime) AS RANGE LEFT FOR VALUES ( '20130131 23:59:59.997', -- 2013 年 1 月 '20130228 23:59:59.997', -- 2013 年 2 月 '20130331 23:59:59.997', -- 2013 年 3 月 '20130430 23:59:59.997', -- 2013 年 4 月 '20130531 23:59:59.997', -- 2013 年 5 月 '20130630 23:59:59.997', -- 2013 年 6 月 '20130731 23:59:59.997', -- 2013 年 7 月 '20130831 23:59:59.997', -- 2013 年 8 月 '20130930 23:59:59.997', -- 2013 年 9 月 '20131031 23:59:59.997', -- 2013 年 10 月 '20131130 23:59:59.997', -- 2013 年 11 月 '20131231 23:59:59.997' -- 2013 年 12 月*/ )
注:1、創建分區函數語法中,LEFT | RIGHT 關鍵字用于指定boundary_value [ ,...n ]中的每個boundary_value 屬于每個邊界值間隔的哪一側(左側還是右側)。如果未指定,則默認值為 LEFT。
2、很明顯,這個分區函數創建了12個分區,因為此時 n=12,所以實際分區總數是 n+1=13。
1.2、刪除分區函數
DROP PARTITION FUNCTION F_Partition_tzkc0075aLog_Range; GO
二、創建與刪除文件組
2.1、創建文件組
ALTER DATABASE DB_ZK3 ADD FILEGROUP FG1_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG2_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG3_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG4_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG5_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG6_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG7_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG8_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG9_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG10_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG11_TZKC0075Log; ALTER DATABASE DB_ZK3 ADD FILEGROUP FG12_TZKC0075Log;
2.2、刪除文件組
ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG1_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG2_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG3_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG4_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG5_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG6_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG7_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG8_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG9_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG10_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG11_TZKC0075Log; ALTER DATABASE DB_ZK3 REMOVE FILEGROUP FG12_TZKC0075Log;
2.3、查詢文件組
select name,type_desc,physical_name,state_desc,size,growth from sys.database_files
三、創建與刪除文件
3.1、刪除文件
ALTER DATABASE DB_ZK3 REMOVE FILE F4_TZKC0075Log;
3.2、創建文件
ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB1_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB1_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG1_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB2_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB2_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG2_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB3_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB3_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG3_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB4_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB4_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG4_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB5_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB5_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG5_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB6_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB6_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG6_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB7_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB7_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG7_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB8_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB8_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG8_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB9_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB9_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG9_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB10_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB10_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG10_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB11_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB11_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG11_TZKC0075Log]; ALTER DATABASE DB_ZK3 ADD FILE(NAME=N'FB12_TZKC0075Log', FILENAME=N'D:\DB_ZK3\FB12_TZKC0075Log.ndf', SIZE=30720KB, FILEGROWTH=10% ) TO FILEGROUP [FG12_TZKC0075Log];
四、創建與刪除分區架構
4.1、創建分區架構
CREATE PARTITION SCHEME [S_Scheme_TZKC0075Log] AS PARTITION F_Partition_tzkc0075aLog_Range TO ([FG1_TZKC0075Log],[FG2_TZKC0075Log],[FG3_TZKC0075Log],[FG4_TZKC0075Log],[FG5_TZKC0075Log], [FG6_TZKC0075Log],[FG7_TZKC0075Log],[FG8_TZKC0075Log],[FG9_TZKC0075Log],[FG10_TZKC0075Log], [FG11_TZKC0075Lot],[FG12_TZKC0075Log],[PRIMARY]);
注意:建議將主數據文件 [PRIMARY] 放在分區最后!
4.2 刪除分區架構
DROP PARTITION SCHEME [S_Scheme_TZKC0075Log];
五、查看分區是否成功
select convert(varchar(50), ps.name) as partition_scheme, p.partition_number, convert(varchar(10), ds2.name) as filegroup, convert(varchar(19), isnull(v.value, ''), 120) as range_boundary, str(p.rows, 9) as rows from sys.indexes i join sys.partition_schemes ps on i.data_space_id = ps.data_space_id join sys.destination_data_spaces dds on ps.data_space_id = dds.partition_scheme_id join sys.data_spaces ds2 on dds.data_space_id = ds2.data_space_id join sys.partitions p on dds.destination_id = p.partition_number and p.object_id = i.object_id and p.index_id = i.index_id join sys.partition_functions pf on ps.function_id = pf.function_id LEFT JOIN sys.Partition_Range_values v on pf.function_id = v.function_id and v.boundary_id = p.partition_number - pf.boundary_value_on_right WHERE i.object_id = object_id('PartitionedTable') -- PartitionedTable 對應具體的分區表名稱 and i.index_id in (0, 1) order by p.partition_number
(完)
| 作者: XuGang 網名:鋼鋼 |
| 出處: http://xugang.cnblogs.com |
| 聲明: 本文版權歸作者和博客園共有。轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接地址! |
浙公網安備 33010602011771號