Azure SQL每月分区(拆分)

问题描述 投票:0回答:1

我已使用Microsoft帮助页面中的示例在DateTime2属性(下面的代码和链接)上使用YYYYMM创建分区。

我将开始分区从201702(2017年2月)设置为202006(2020年6月)。

我希望能够在上个月的月初(如果尚不存在)在下个月添加(拆分?)新分区。当日期为2020年6月1日时,它将为7月创建一个新分区。我不确定如何继续。

我尝试查看Azure文档,但仅包含标准编号的示例。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-partition-function-transact-sql?view=sql-server-ver15

--Create date partition function with increment by month.  
DECLARE @DatePartitionFunction nvarchar(max) = 
    N'CREATE PARTITION FUNCTION DatePartitionFunction (datetime2) 
    AS RANGE RIGHT FOR VALUES (';  
DECLARE @i datetime2 = '20170201';  
WHILE @i < '20200601'  
BEGIN  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10)) + '''' + N', ';  
SET @i = DATEADD(MM, 1, @i);  
END  
SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10))+ '''' + N');';  
EXEC sp_executesql @DatePartitionFunction;  
GO  
sql-server azure database-partitioning
1个回答
1
投票

我不知道他们为什么在示例中选择使用动态SQL,但这不是必需的。下面是带有静态SQL的版本,该版本使用变量来指定新边界,并包括用于完整性的分区方案。

--Create monthly partitions for all months in the desired range
CREATE PARTITION FUNCTION DatePartitionFunction (datetime2) 
    AS RANGE RIGHT FOR VALUES ();

DECLARE @MonthStartDate datetime2 = '20170201';  
WHILE @MonthStartDate < '20200601'  
BEGIN  
    ALTER PARTITION FUNCTION DatePartitionFunction()
        SPLIT RANGE(@MonthStartDate);
    SET @MonthStartDate = DATEADD(month, 1, @MonthStartDate);
END;

CREATE PARTITION SCHEME DatePartitionScheme
    AS PARTITION DatePartitionFunction ALL TO ([PRIMARY]);
GO 

最好在下一个周期开始之前创建新的每月分区,以避免在SPLIT期间进行昂贵的数据移动,与常规DML相比,这还需要大约4倍的日志记录。如果尚不存在,此示例将为下个月创建一个分区:

--Run this to create a new partition before the next future month if it doesn't already exist
DECLARE @MonthStartDate datetime2 = DATEADD(day, 1, CAST(EOMONTH(GETDATE()) AS date));  
IF NOT EXISTS(
    SELECT * 
    FROM sys.partition_functions AS pf
    JOIN sys.partition_range_values AS prv ON prv.function_id = pf.function_id
    WHERE
        pf.name = N'DatePartitionFunction'
        AND prv.value = @MonthStartDate
    )
BEGIN
    ALTER PARTITION SCHEME DatePartitionScheme
        NEXT USED [PRIMARY];
    ALTER PARTITION FUNCTION DatePartitionFunction()
        SPLIT RANGE(@MonthStartDate);
END;
GO
© www.soinside.com 2019 - 2024. All rights reserved.