私はあいまいさを避けるために、私の答えに分離されていない日付書式YYYYMMDDを使用しています。 RANGE LEFT
パーティション機能の範囲指定で
は、包括的な新しい境界を持つ新しいパーティションが1つのビーイング分割を既存の左側に作成されます。既存のパーティション内の行は、新しい境界に合わせて新しいパーティションに移動されます。 RANGE LEFT
の範囲で一日に1日だけデータを移動するには、希望の終了日( '20160515')に達するまで、最も早い日付( '20160204')で分割して開始する必要があります。
最初のパーティションを分割するには、境界は 4/2/2016 15/5/2016までです。
あなたの既存の境界線は正確にはわかりませんが、最初のパーティションの下限は常にNULL
です。 RANGE LEFT
の範囲では、最初のパーティションには最初の境界以下のすべての行が含まれます。私の答えの目的のために、私は最初の既存の境界が '20160506'であり、この日付以前のデータを含んでいると仮定します。
空でないパーティションを分割することは避けてください。SQL Server Books Onlineによれば、DDL SPLIT
が空でないパーティションによるデータ移動には、通常のDML操作と比較して約4倍のログが必要です。これは、パーティション化シナリオで一般的に使用される大きなテーブルでは特にコストがかかります。
テーブルとインデックスが同じ機能を使用してパーティション化されていると仮定して、目的の結果を達成するもう1つの方法は、ステージングパーティション機能、パーティションスキーム、およびテーブルを現在のものとまったく同じだが異なる名前で作成することです。次に、ステージングテーブルにSWITCH
全体の最初のパーティションと次の手順を実行
1)各新しい日付パーティションについて、新しい日付パーティションとSPLIT新しいで元のパーティション機能のために所望のように元のパーティションスキームNEXT USED
ファイルグループをALTER日付の境界。これにより、元のテーブルに新しい空のパーティションが作成されます。
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