web-dev-qa-db-ja.com

複数のパーティションテーブルとALTER TABLE SWITCHのインデックス付きビュー

2つのパーティション分割されたテーブルを組み合わせたインデックス付きビューがあり、ALTER TABLE SWITCHを使用して両方のベーステーブルからデータを移動することは可能ですか?これを試したときに次のエラーが表示され、解決方法がわからないようです(解決できる場合でも)。

ALTER TABLE SWITCHステートメントが失敗しました。テーブル 'im_db.dbo.SM_MEDIA_NEUTRAL_STATE_FACT'は、インデックス付きビュー 'V_STATE_RSN_AGG_BASE'のインデックス 'IX_V_STATE_RSN_AGG_BASE'に対応していません。テーブルは列 'START_DATE_TIME_KEY'でパーティション化されていますが、インデックス付きビューのインデックスはテーブル 'SM_RES_STATE_REASON_FACT'の別の列 'START_DATE_TIME_KEY'から選択された列 'start_date_time_key'でパーティション化されています。パーティション化列がテーブルのパーティション化列と同じになるように、インデックス付きビューの定義を変更します。;

パーティション列を変更しようとしましたが、どちらを使用するか(どのベーステーブルから)は問題ではありません。

4
jbomgard

インデックス付きビューの集計のグループ化列の1つでパーティションを作成しているようです。この場合、インデックス付きビューは、パーティション化されている公開されたグループ化列を含む、パーティション化されたテーブルの1つのみと整列されます。

インデックス付きビューが定義されている場合のパーティション切り替え本のオンライントピック は次のように述べています。

ビューが複数のテーブルを参照している場合(結合、サブクエリ、関数などを使用)、インデックス付きビューは、パーティション分割されたテーブルの1つのみとパーティションアラインされます。

その結果、テーブルの1つだけにパーティションを切り替えたり、パーティションを切り替えたりすることができます。以下はデモスクリプトです。

CREATE PARTITION FUNCTION PF_START_DATE_TIME_KEY(int) 
    AS RANGE RIGHT FOR VALUES(1);
CREATE PARTITION SCHEME PS_START_DATE_TIME_KEY 
    AS PARTITION PF_START_DATE_TIME_KEY ALL TO ([PRIMARY]);
CREATE TABLE dbo.DATE_TIME_DIM(
      START_DATE_TIME_KEY int
    , DATE_TIME datetime2(0)
    );
CREATE TABLE dbo.SM_MEDIA_NEUTRAL_STATE_FACT(
      START_DATE_TIME_KEY int NOT NULL
    , CorrelationID int NOT NULL
    , Col1 int NOT NULL
    ) ON PS_START_DATE_TIME_KEY(START_DATE_TIME_KEY);
CREATE TABLE dbo.SM_RES_STATE_REASON_FACT(
      START_DATE_TIME_KEY int NOT NULL
      , CorrelationID int NOT NULL
      , Col1 int NOT NULL
    ) ON PS_START_DATE_TIME_KEY(START_DATE_TIME_KEY);
CREATE TABLE dbo.SM_MEDIA_NEUTRAL_STATE_FACT_STAGING(
      START_DATE_TIME_KEY int NOT NULL
    , CorrelationID int NOT NULL
    , Col1 int NOT NULL
    ) ON PS_START_DATE_TIME_KEY(START_DATE_TIME_KEY);
CREATE TABLE dbo.SM_RES_STATE_REASON_FACT_STAGING(
      START_DATE_TIME_KEY int NOT NULL
    , CorrelationID int NOT NULL
    , Col1 int NOT NULL
    ) ON PS_START_DATE_TIME_KEY(START_DATE_TIME_KEY);
GO

CREATE VIEW dbo.V_STATE_RSN_AGG_BASE
WITH SCHEMABINDING
AS
SELECT
      SM_RES_STATE_REASON_FACT.START_DATE_TIME_KEY
    , SUM(SM_MEDIA_NEUTRAL_STATE_FACT.col1) AS col1
    , SUM(SM_RES_STATE_REASON_FACT.col1) AS col2
    , COUNT_BIG(*) AS CountBig
FROM dbo.SM_MEDIA_NEUTRAL_STATE_FACT
JOIN dbo.SM_RES_STATE_REASON_FACT ON
    SM_MEDIA_NEUTRAL_STATE_FACT.CorrelationID = SM_RES_STATE_REASON_FACT.CorrelationID
GROUP BY SM_RES_STATE_REASON_FACT.START_DATE_TIME_KEY;
GO

CREATE UNIQUE CLUSTERED INDEX IX_V_STATE_RSN_AGG_BASE ON
    dbo.V_STATE_RSN_AGG_BASE(START_DATE_TIME_KEY)
    ON PS_START_DATE_TIME_KEY(START_DATE_TIME_KEY);
GO

--this SWITCH succeeds because the indexed view partitioning column is from the SM_RES_STATE_REASON_FACT table
TRUNCATE TABLE dbo.SM_RES_STATE_REASON_FACT_STAGING;
ALTER TABLE dbo.SM_RES_STATE_REASON_FACT
    SWITCH PARTITION $PARTITION.PF_START_DATE_TIME_KEY(1) 
    TO dbo.SM_RES_STATE_REASON_FACT_STAGING PARTITION $PARTITION.PF_START_DATE_TIME_KEY(1);
GO

--this SWITCH fails because the indexed view partitioning column is not from the SM_MEDIA_NEUTRAL_STATE_FACT table
TRUNCATE TABLE dbo.SM_MEDIA_NEUTRAL_STATE_FACT_STAGING;
ALTER TABLE dbo.SM_MEDIA_NEUTRAL_STATE_FACT
    SWITCH PARTITION $PARTITION.PF_START_DATE_TIME_KEY(1) 
    TO dbo.SM_MEDIA_NEUTRAL_STATE_FACT_STAGING PARTITION $PARTITION.PF_START_DATE_TIME_KEY(1);
GO
4
Dan Guzman