當某張數據表數據量較大時,我們就需要對該表進行分區處理,以下sql語句,會將數據表按月份,分為12個分區表存儲數據,廢話不多說,直接上腳本:
use [SIT_L_TMS] --開啟 XP_CMDSHELL;開啟創建文件夾權限 GO SP_CONFIGURE 'SHOW ADVANCED OPTIONS',1 RECONFIGURE GO SP_CONFIGURE 'XP_CMDSHELL',1 RECONFIGURE GO --數據庫名 declare @servername varchar(20) ; -- 變量賦值 set @servername = 'SIT_L_TMS' ; --待執行sql declare @sql varchar(1024) ; --設置年 declare @year varchar(10); set @year = CONVERT(varchar(4), GETDATE(), 23); --月數 declare @summonths int; set @summonths = 12; --文件組存放路徑 declare @file_path varchar(200); set @file_path = 'F:\db_group\' + @year; --判斷文件夾是否存在,不存在則創建 declare @TEMP TABLE(A INT,B INT,C INT);--建立虛擬表,用來判斷文件夾是否存在 INSERT @TEMP EXEC [MASTER]..XP_FILEEXIST @file_path; IF NOT EXISTS(SELECT * FROM @TEMP WHERE B=1) BEGIN --XP_CMDSHELL不允許使用變量拼接,所以使用exec方法 declare @EX NVARCHAR(255) SET @EX = 'EXEC XP_CMDSHELL ''MKDIR ' + @file_path + ''''; EXEC(@EX) END --文件組名 declare @filegroupname varchar(50); --文件組路徑:完整路徑,含文件名 declare @filegrouppath varchar(300); --分區函數 declare @partition_func varchar(128) ; set @partition_func = 'l_tms_partition_func'; --分區結構 declare @partition_scheme varchar(128) ; set @partition_scheme = 'l_tms_partition_scheme'; --時間 declare @datetime varchar(10); --按時間分區語句 declare @fuction_sql varchar(1024); --按時間分區結構 declare @scheme_sql varchar(1024); --建立12個分區 declare @i int; set @i = 1; while @i<(@summonths+1) begin declare @date varchar(10) if @i < 10 begin set @date = '0' + convert(varchar,@i); end else begin set @date = convert(varchar,@i); end -- 添加文件組名;文件組名按日期:例如20180401 set @datetime = @year + @date; set @filegroupname = 'Group' + @year + @date; set @sql = 'alter database ' + @servername + ' add filegroup '+ @filegroupname; print @sql; exec(@sql); --將文件組名與文件關聯 set @filegrouppath = @file_path + '\' + @filegroupname + '.ndf'; set @sql = 'alter database '+ @servername + ' add file (name=N'''+ @filegroupname +''',filename=N'''+ @filegrouppath +''',size=5Mb,filegrowth=5mb) to filegroup '+ @filegroupname; print @sql; exec(@sql); --拼接按時間分區函數/拼接按時間分區結構 if @i = 1 begin set @fuction_sql = '''' + @datetime + '01 23:59:59' + '''' + ','; set @scheme_sql = '['+ @filegroupname +']' + ','; end else if @i = 12 begin set @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + ''''; set @scheme_sql = @scheme_sql + '['+ @filegroupname +']'; end else begin set @fuction_sql = @fuction_sql + '''' + @datetime + '01 23:59:59' + '''' + ','; set @scheme_sql = @scheme_sql + '['+ @filegroupname +']' + ','; end set @i = @i + 1; end -- 創建分區函數 set @sql = 'create partition function '+ @partition_func +'(DATETIME) as range left for values('+ @fuction_sql+')'; print @sql; exec(@sql); -- 創建分區結構(將分區函數和分區組對應起來) set @sql = 'create partition scheme '+ @partition_scheme +' as partition '+ @partition_func +' to(' + @scheme_sql + ',[Primary])'; print @sql; exec(@sql); --將普通表轉換為分區表 --刪除主鍵 ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] DROP constraint PK_TMS_RealTimeEqptInfo --創建主鍵,但不設為聚集索引 ALTER TABLE [dbo].[TMS_RealTimeEqptInfo] ADD constraint PK_TMS_RealTimeEqptInfo PRIMARY KEY NONCLUSTERED ( [ID] ASC )ON [PRIMARY] --創建一個新的聚集索引,並在該聚集索引中使用分區方案;注意修改分區方案的名字,按字段WriteTime進行分區 CREATE CLUSTERED INDEX CT_RealTimeData on TMS_RealTimeEqptInfo([WriteTime]) ON etm_partition_scheme([WriteTime])
數據庫名稱和數據表名稱自行對應修改。