web-dev-qa-db-ja.com

現在のクラスター化インデックスに属していない列でテーブルをパーティション分割する

次の表、3億行、2011年から今日までのデータ(テストシステムで2017年3月24日まで)を分割しています

たとえば、次の形式の日付を持つOrderDateSIDintという列でテーブルをパーティション分割したい: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列に基づいて削除を改善する必要があります)?

2

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だと思います。

1
Scott Hodgin