2016-05-15 26 views
1

パーティションがあるテーブルがあります。最初のパーティションには4か月分のデータが含まれ、その他のパーティションは1日ごとに、パーティションは左に設定されます。SQL Serverでパーティションを切り替える

は私が一日で最初のパーティションを分割したいと、境界が15/5/2016まで2016年4月2日です。

私の質問は:私は左からまたは右から切り替える必要がありますか?例えば

Iは、2016年4月2日(一日)に2016年5月2日、システムの書き込みに切り替えた場合、または第2の5/2/2016から15/2016分の5

に書き込みます

おかげ

答えて

1

私はあいまいさを避けるために、私の答えに分離されていない日付書式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 
関連する問題