當某張數據表數據量較大時,我們就需要對該表進行分區處理,以下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])
數據庫名稱和數據表名稱自行對應修改。
