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'でパーティション化されています。パーティション化列がテーブルのパーティション化列と同じになるように、インデックス付きビューの定義を変更します。;
パーティション列を変更しようとしましたが、どちらを使用するか(どのベーステーブルから)は問題ではありません。
インデックス付きビューの集計のグループ化列の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