Azure SQL 每月分区(拆分)
Azure SQL Monthly Partitioning (Split)
我使用 Microsoft 帮助页面中的示例在 DateTime2 属性 上使用 YYYYMM 创建分区(下面的代码和 link)。
我将起始分区设置为 201702(2017 年 2 月)到 202006(2020 年 6 月)。
我希望能够在上个月的月初为下个月添加(拆分?)一个新分区 - 如果它尚不存在。当日期为 2020 年 6 月 1 日时,它将为 7 月创建一个新分区。我不确定如何进行。
我试过查看 Azure 文档,但它只包含标准数字的示例。
--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,但这不是必需的。下面是一个带有静态 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
我使用 Microsoft 帮助页面中的示例在 DateTime2 属性 上使用 YYYYMM 创建分区(下面的代码和 link)。
我将起始分区设置为 201702(2017 年 2 月)到 202006(2020 年 6 月)。
我希望能够在上个月的月初为下个月添加(拆分?)一个新分区 - 如果它尚不存在。当日期为 2020 年 6 月 1 日时,它将为 7 月创建一个新分区。我不确定如何进行。
我试过查看 Azure 文档,但它只包含标准数字的示例。
--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,但这不是必需的。下面是一个带有静态 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