sql server 按月對數據表進行分區


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

  數據庫名稱和數據表名稱自行對應修改。


免責聲明!

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



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