2016-05-15 4 views
1

У меня есть таблица с разделами. Только первый раздел содержит данные за 4 месяца, остальные разделы - днем, а раздел - как левый.Переключить раздел в SQL Server

Я хочу разделить первый раздел на день, граница - с 4/2/2016 по 15/5/2016.

Мой вопрос: следует ли переключаться слева или справа?

Например, если я переключиться на 5/2/2016, система записи на 4/2/2016 (только один день) или записи на второй 5/2/2016-15/5/2016

Спасибо

ответ

1

Я использую нерассмотренный формат даты 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 
Смежные вопросы