SELECT * FROM SYS.filegroups;
SELECT * FROM SYS.sysfiles
SELECT * FROM SYS.master_files
ALTER DATABASE [TEST2018] ADD FILEGROUP GROUP_A000000;
alter database [TEST2018] add file
(name=N'FILE_A000000',filename=N'Z:\DB_DATA\FILE_A000000.ndf',size=5Mb,filegrowth=5mb)
to filegroup GROUP_A000000
ALTER DATABASE [TEST2018] ADD FILEGROUP GROUP_A999999
alter database [TEST2018] add file
(name=N'FILE_A999999',filename=N'Z:\DB_DATA\FILE_A999999.ndf',size=5Mb,filegrowth=5mb)
to filegroup GROUP_A999999
ALTER DATABASE [TEST2018] ADD FILEGROUP GROUP_Z999999
alter database [TEST2018] add file
(name=N'FILE_Z999999',filename=N'Z:\DB_DATA\FILE_Z999999.ndf',size=5Mb,filegrowth=5mb)
to filegroup GROUP_Z999999
CREATE PARTITION FUNCTION [PFUN_CORP](NVARCHAR(50)) AS RANGE LEFT FOR VALUES (N'A000000',N'A999999')
备注:创建分区函数时,left right的区别看一下官方文档,很详细
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-partition-function-transact-sql?view=sql-server-ver15
--创建分区方案
CREATE PARTITION SCHEME [PSCH_CORP] AS PARTITION [PFUN_CORP] TO (GROUP_A000000,GROUP_A999999,GROUP_Z999999)
CREATE TABLE PTEST_GS
(
ID INT IDENTITY(1,1),
CORPCODE NVARCHAR(50),
AMT DECIMAL(38,6)
) ON [PSCH_CORP](CORPCODE)
SELECT * FROM PTEST_GS
--查询分区依据列为10000014的数据在哪个分区上
select $partition.[PFUN_CORP]('A000000')
select $partition.[PFUN_CORP]('A999999')
--查看某一个分区有多少种类型的值:看值是否重复
SELECT * FROM PTEST_GS
WHERE $PARTITION.[PFUN_CORP](corpcode) = 2 ;
--INSERT INTO PTEST_GS(CORPCODE)VALUES('A000002')
--新增加一个分区
ALTER DATABASE [TEST2018] ADD FILEGROUP GROUP_A000002
alter database [TEST2018] add file
(name=N'FILE_A000002',filename=N'Z:\DB_DATA\FILE_A000002.ndf',size=5Mb,filegrowth=5mb)
to filegroup GROUP_A000002
ALTER PARTITION SCHEME [PSCH_CORP] NEXT USED GROUP_A000002
ALTER PARTITION FUNCTION [PFUN_CORP]() SPLIT RANGE(N'A000002');
[TEST2018]
--开始创建动态的分组信息
ALTER PROCEDURE SP_DynamicPartition
@CORPCODE NVARCHAR(50)
AS
BEGIN
IF ISNULL(@CORPCODE,'')<>'' AND LEN(@CORPCODE)>0
BEGIN
DECLARE @GROUPNAME NVARCHAR(64)='GROUP_'+@CORPCODE
DECLARE @FILENAME NVARCHAR(64)='FILE_'+@CORPCODE
--判断是否存在对应的文件群组
IF NOT EXISTS (SELECT 1 FROM SYS.filegroups WHERE NAME=@GROUPNAME)
BEGIN
EXEC('ALTER DATABASE [TEST2018] ADD FILEGROUP '+@GROUPNAME+'')
END
ELSE
BEGIN
PRINT '数据库文件群组已存在'
END
IF NOT EXISTS(SELECT 1 FROM SYS.sysfiles WHERE NAME=@FILENAME)
BEGIN
EXEC('alter database [TEST2018] add file
(name=N'''+@FILENAME+''',filename=N''Z:\DB_DATA\'+@FILENAME+'.ndf'',size=5Mb,filegrowth=5mb)
to filegroup '+@GROUPNAME+'')
END
ELSE
BEGIN
PRINT N'数据库文件已存在'
END
IF NOT EXISTS(SELECT 1
FROM sys.partition_schemes A,sys.destination_data_spaces B ,SYS.data_spaces C
WHERE A.data_space_id=B.partition_scheme_id
AND B.data_space_id=C.data_space_id
AND A.name='PSCH_CORP' AND C.NAME=@GROUPNAME)
BEGIN
EXEC('ALTER PARTITION SCHEME [PSCH_CORP] NEXT USED '+@GROUPNAME+'')
END
ELSE
BEGIN
PRINT N'分区方案已存在该文件组'
END
IF NOT EXISTS(SELECT * FROM sys.partition_functions A LEFT JOIN sys.partition_range_values B ON A.function_id=B.function_id WHERE B.value=@CORPCODE)
BEGIN
EXEC('ALTER PARTITION FUNCTION [PFUN_CORP]() SPLIT RANGE(N'''+@CORPCODE+''')');
END
ELSE
BEGIN
PRINT N'分区函数已存在该范围'
END
END
ELSE
BEGIN
PRINT N'CORPCODE 不能为空'
END
END
--测试
exec SP_DynamicPartition 'A000007'
SELECT* FROM SYS.filegroups
SELECT * FROM SYS.sysfiles
参考文档
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-partition-scheme-transact-sql?view=sql-server-ver15
---以下内容忽略
SELECT * FROM sys.partition_functions A LEFT JOIN sys.partition_range_values B ON A.function_id=B.function_id WHERE B.value=@CORPCODE
SELECT * from sys.partition_range_values
----其他一些查询信息,具体可以参阅官方文档内容
--select $partition.[PFUN_CORP]('A000002')
exec sp_show_partition_range
--该存贮过程是用来查看对应的分区值的范围
create procedure dbo.sp_show_partition_range
(
@partition_table nvarchar(255) = null
,@partition_function nvarchar(255) = null
)
as
begin
set nocount on
declare @function_id int
set @function_id = null
-- get @function_id base on @partition_table
if len(@partition_table) > 0 begin
select @function_id = s.function_id
from sys.indexes i
inner join sys.partition_schemes s
on i.data_space_id = s.data_space_id
where i.index_id < 2
and i.object_id = object_id(@partition_table)
if @function_id is null
return 1
end
-- get @function_id base on @partition_function
if len(@partition_function) > 0 begin
select @function_id = function_id
from sys.partition_functions
where name = @partition_function
if @function_id is null
return 1
end
-- get partition range
select partition_function = f.name
,t.partition
,t.minval
,value = case when f.boundary_value_on_right=1 then '<= val <' else '< val <=' end
,t.maxval
from (
select h.function_id
,partition = h.boundary_id
,minval = l.value
,maxval = h.value
from sys.partition_range_values h
left join sys.partition_range_values l
on h.function_id = l.function_id and h.boundary_id = l.boundary_id + 1
union all
select function_id
,partition = max(boundary_id) + 1
,minval = max(value)
,maxval = null
from sys.partition_range_values
group by function_id
) t
inner join sys.partition_functions f
on t.function_id = f.function_id
where f.function_id = @function_id
or @function_id is null
order by 1, 2
end
SELECT * FROM sys.partition_functions
select * from sys.partition_parameters
select * from sys.partition_range_values
--测试一下具体的对应关系
select A.name,B.name,C.value,D.name
from sys.partition_schemes A
LEFT JOIN sys.partition_functions B ON A.function_id=B.function_id
LEFT JOIN sys.partition_range_values C ON B.function_id=C.function_id
LEFT JOIN sys.data_spaces D ON A.data_space_id=D.data_space_id