sqlserver2012分區表示例



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










 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章