次の表、3億行、2011年から今日までのデータ(テストシステムで2017年3月24日まで)を分割しています
たとえば、次の形式の日付を持つOrderDateSID
int
という列でテーブルをパーティション分割したい:20170401
ために April 1st 2017
これは私のテーブル定義です。非常に長く、現在のすべてのインデックスも含まれています。
IF OBJECT_ID('[Facts].[FactOrder]') IS NOT NULL
DROP TABLE [Facts].[FactOrder]
GO
CREATE TABLE [Facts].[FactOrder] (
[FactOrderSID] BIGINT NOT NULL,
[OrderNo] VARCHAR(20) NULL,
[OrderItemSeqNo] SMALLINT NULL,
[OrderNoItemSeqNo] VARCHAR(30) NULL,
[OrderDetailsSID] INT NULL,
[ChannelSID] INT NULL,
[OrderDateSID] INT NULL,
[OrderTypeSID] INT NULL,
[CoreStatusSID] INT NULL,
[ProductSubSeasonID] INT NULL,
[OrderSubSeasonID] INT NULL,
[MarketSID] INT NULL,
[ProductSID] INT NULL,
[CurrencyCodeSID] INT NULL,
[LocalOrderDateSID] INT NULL,
[FullSellingPrice] NUMERIC(18,4) NULL,
[PriceSetPrice] NUMERIC(18,4) NULL,
[ActualSellingPrice] NUMERIC(18,4) NULL,
[ActualTaxableAmount] NUMERIC(18,4) NULL,
[CostofGoodsAmount] NUMERIC(18,4) NULL,
[ShipFullPrice] NUMERIC(18,4) NULL,
[ShipActualPrice] NUMERIC(18,4) NULL,
[ShipActualTaxAmount] NUMERIC(18,4) NULL,
[BCFullSellingPrice] NUMERIC(18,4) NULL,
[BCPriceSetPrice] NUMERIC(18,4) NULL,
[BCActualSellingPrice] NUMERIC(18,4) NULL,
[BCActualTaxableAmount] NUMERIC(18,4) NULL,
[BCCostofGoodsAmount] NUMERIC(18,4) NULL,
[BCShipFullPrice] NUMERIC(18,4) NULL,
[BCShipActualPrice] NUMERIC(18,4) NULL,
[BCShipActualTaxAmount] NUMERIC(18,4) NULL,
[UnitsSold] INT NULL,
[LoadID] INT NULL,
[ActualProductSID] INT NULL,
[AccountSID] INT NOT NULL,
[PriceDiscount] NUMERIC(18,4) NULL,
[BCPriceDiscount] NUMERIC(18,4) NULL,
[PromotionalDiscount] NUMERIC(18,4) NULL,
[BCPromotionalDiscount] NUMERIC(18,4) NULL,
[GrossDemand] NUMERIC(18,4) NULL,
[BCGrossDemand] NUMERIC(18,4) NULL,
[UKFSPIncVAT] NUMERIC(18,4) NULL,
[UKFSPExVAT] NUMERIC(18,4) NULL,
[BCTotalDiscount] NUMERIC(18,4) NULL,
[TotalDiscount] NUMERIC(18,4) NULL,
[OrderNoItemSeqNoSID] INT NOT NULL,
[OfferSID] INT NULL,
[MarkdownStatusSID] INT NOT NULL,
[AdvertisedPrice] NUMERIC(18,4) NULL,
[BCAdvertisedPrice] NUMERIC(18,4) NULL,
[CataloguePriceSetTypeSID] INT NOT NULL,
[UserSID] INT NULL,
CONSTRAINT [PK_FactOrder]
PRIMARY KEY CLUSTERED ([FactOrderSID] asc) WITH FILLFACTOR = 100)
GO
CREATE NONCLUSTERED INDEX [Facts_FactOrder_LoadID]
ON [Facts].[FactOrder] ([LoadID] asc)
INCLUDE ([FactOrderSID])
WITH FILLFACTOR = 100
CREATE NONCLUSTERED INDEX [Facts_FactOrder_OrderDateSID]
ON [Facts].[FactOrder] ([OrderDateSID] asc)
INCLUDE ([FactOrderSID])
WITH FILLFACTOR = 100
CREATE NONCLUSTERED INDEX [Facts_FactOrder_OrderNoItemSeqNoSID]
ON [Facts].[FactOrder] ([OrderNoItemSeqNoSID] asc)
INCLUDE ([FactOrderSID], [OrderDateSID])
WITH FILLFACTOR = 100
CREATE NONCLUSTERED INDEX [IDX_Facts_FactOrder_Channel_INC_AccountSID]
ON [Facts].[FactOrder] ([AccountSID] asc)
INCLUDE ([ChannelSID])
WITH FILLFACTOR = 100
CREATE NONCLUSTERED INDEX [IX_Facts_FactOrder_OrderDetailsSID]
ON [Facts].[FactOrder] ([OrderDetailsSID] asc)
WITH FILLFACTOR = 100
CREATE NONCLUSTERED INDEX [IX_Facts_FactOrder_UKFSPExVAT__INCLU]
ON [Facts].[FactOrder] ([UKFSPExVAT] asc)
INCLUDE ([ActualProductSID], [MarketSID])
WITH FILLFACTOR = 100
----------------------------------------------------------------------------
--- create a partition function
----------------------------------------------------------------------------
use radhe
go
IF EXISTS (SELECT * FROM sys.partition_functions
WHERE name = 'PF_Facts_FactOrder_OrderDateSID')
DROP PARTITION FUNCTION PF_Facts_FactOrder_OrderDateSID ;
GO
CREATE PARTITION FUNCTION PF_Facts_FactOrder_OrderDateSID (int)
AS RANGE LEFT FOR VALUES ( 20110101,
20120101,
20130101,
20140101,
20150101,
20160101,
20170101);
そして私はパーティションスキーマを作成しました:
----------------------------------------------------------------------------
--- Create a Partition Scheme
----------------------------------------------------------------------------
use radhe
go
DROP PARTITION SCHEME PSC_OrderDateSID
GO
CREATE PARTITION SCHEME PSC_OrderDateSID AS
PARTITION PF_Facts_FactOrder_OrderDateSID TO
([F0],[F1], [F2], [F3], [F4], [F5], [F6], [F7])
GO
テーブルには、パーティション列を含まないが、PRIMARY KEYまたはUNIQUE制約の一部として作成されたクラスター化インデックスがあります
私の質問は:
私はこれらの2つのオプションの間で私の決心をすることはできません:
1)
クラスター化された主キーを変更し、パーティション列を追加します
2)
主キーをNONCLUSTERED
に変更して、このインデックスをCLUSTERED
にします:Facts_FactOrder_OrderDateSID
これら2つのオプションの長所と短所は何ですか?特にこの目的に役立つものを選択するにはどうすればよいですか(OrderDateSID
列に基づいて削除を改善する必要があります)?
OrderDateSIDに基づく削除を改善したいという願望に基づいて(パーティションの削除を利用することにより)、オプション2はオプションとしてはまったく見えません。
パーティショニングシナリオに含まれるすべての一意の制約には、ベースインデックス定義(インデックスキーのサブセット)の一部として定義されたパーティション列が含まれている必要があります(単に含まれている列ではありません)。つまり、基本インデックスの定義にパーティション化キー列が含まれていないため、主キー(非クラスターとして定義されていても)はこのパーティション化シナリオに参加できません。
パーティション分割スキームに対して主キーを作成しようとした場合
ALTER TABLE [Facts].[FactOrder] ADD CONSTRAINT [PK_FactOrder] PRIMARY KEY NONCLUSTERED
(
[FactOrderSID] ASC
)On PSC_OrderDateSID(OrderDateSID)
GO
あなたはこのエラーを受け取ります
メッセージ1908、レベル16、状態1、行3列 'OrderDateSID'は、インデックス 'PK_FactOrder'のパーティション列です。一意のインデックスのパーティション列は、インデックスキーのサブセットである必要があります。メッセージ1750、レベル16、状態1、行3制約またはインデックスを作成できませんでした。以前のエラーを参照してください。
これで、主キーのパーティショニングをサポートするために別のパーティション関数とスキームを確実に作成できます(パーティションレベルとしてインデックスを再構築するのに役立つ可能性があります)が、他のパーティションに位置合わせされないため、許可されません。 OrderDateSIDはベースインデックス定義の一部ではないため、パーティションの切り替えを実行することはできません。パーティションの削除には関与しません。
あなたの唯一のオプションはオプション1だと思います。