Я использую нерассмотренный формат даты YYYYMMDD в своем ответе, чтобы избежать двусмысленности.
С спецификацией диапазона разделов RANGE LEFT
новый раздел с открытой новой границей создается слева от существующего разделяемого. Строки в существующем разделе затем перемещаются в новый раздел для размещения новых границ. Чтобы перемещать только один день данных за один раз с диапазоном RANGE LEFT
, вы должны начать с разбивки с самой ранней датой ('20160204'), пока не достигнете нужной даты окончания ('20160515').
Я хочу разбить первый раздел на день до границы, 4/2/2016 до 15/5/2016.
Мне непонятно, каковы ваши существующие границы, но имейте в виду, что нижняя граница первой секции всегда равна NULL
. С диапазоном RANGE LEFT
первый раздел включает в себя все строки, меньшие или равные первой границе. Для моего ответа я предполагаю, что первая существующая граница - «20160506» и включает данные с этой даты и ранее.
Я рекомендую избегать расщепления непустых разделов. Согласно SQL Server Books Online, перемещение данных с помощью DDL SPLIT
непустого раздела требует около 4-кратного ведения журнала по сравнению с обычной операцией DML. Это особенно дорого стоит с большими таблицами, которые обычно используются в сценариях разбиения.
Другой способ достижения желаемого результата, если ваша таблица и индексы выровнены (разделены с использованием одной и той же функции), заключается в создании промежуточной функции раздела, схемы разделов и таблицы в точности как текущие, но с разными именами. Затем SWITCH
весь первый раздел в промежуточной таблицу и выполнить следующие шаги:
1) Для каждого нового дату раздела, изменить оригинальную схему разделов NEXT USED
файловой группы, как требуется для новой даты раздела и разделить исходную функцию перегородки с новым даты. Это создаст новые пустые разделы в исходной таблице.
2) Перегруппируйте индексы промежуточной позиции с использованием исходной схемы разделов. Это можно сделать наиболее эффективно с помощью CREATE INDEX...WITH(DROP_EXISTING=ON)
.
3) Теперь, когда исходная и промежуточная таблица выровнены, SWITCH
каждый раздел промежуточного стола возвращается в пустые исходные таблицы.
Ниже приведен пример сценария. Предоставьте вам таблицу, функцию раздела и схему DDL разделов, если вам нужна дополнительная информация.
--create a staging table exactly like the original table
CREATE TABLE dbo.PartitionedTable_Staging(
Col1 date
, Col2 int
, CONSTRAINT PK_PartitionedTable_Staging PRIMARY KEY (Col1, Col2)
) ON PS_PartitionedTable_Staging(Col1);
CREATE INDEX idx ON dbo.PartitionedTable_Staging(Col1) ON PS_PartitionedTable_Staging(Col1);
--switch first partition into staging table
ALTER TABLE dbo.PartitionedTable
SWITCH PARTITION 1 TO
dbo.PartitionedTable_Staging PARTITION 1;
--create new partitions in original table
DECLARE @Date date = '20160204';
DECLARE @EndDate date = '20160515';
WHILE @Date <= @EndDate
BEGIN
ALTER PARTITION SCHEME PS_PartitionedTable NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION PF_PartitionedTable() SPLIT RANGE(@Date);
SET @Date = DATEADD(day, 1, @Date);
END;
GO
--repartition staging table indexes using modified partition function
CREATE UNIQUE CLUSTERED INDEX PK_PartitionedTable_Staging ON dbo.PartitionedTable_Staging (Col1,Col2)
WITH(DROP_EXISTING=ON)
ON PS_PartitionedTable(Col1);
CREATE INDEX idx
ON dbo.PartitionedTable_Staging(Col1)
WITH(DROP_EXISTING=ON);
--switch partitions from staging table back into original table
DECLARE @Date date = '20160204';
DECLARE @EndDate date = '20160515';
WHILE @Date <= @EndDate
BEGIN
ALTER TABLE dbo.PartitionedTable_Staging
SWITCH PARTITION $PARTITION.PF_PartitionedTable(@Date) TO
dbo.PartitionedTable PARTITION $PARTITION.PF_PartitionedTable(@Date);
SET @Date = DATEADD(day, 1, @Date);
END;
GO
--drop staging table
DROP TABLE dbo.PartitionedTable_Staging;
GO