【问题标题】:Azure SQL Monthly Partitioning (Split)Azure SQL 每月分区(拆分)
【发布时间】:2020-05-30 17:31:24
【问题描述】:

我使用 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】:

    我不知道他们为什么选择在示例中使用动态 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-05
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多