web-dev-qa-db-ja.com

テーブルパーティションスイッチアウトの問題

助けてください!設定したパーティションからの切り替え中にエラーが発生しました。以下のスクリプトとエラー情報があります。

範囲ごとに個別のファイルグループを作成しました

-パーティション関数の作成

USE [ApplicationLogs]
GO
CREATE PARTITION FUNCTION [FN_SchedulerLog](datetime) AS RANGE LEFT FOR VALUES (N'2016-06-30T23:59:59.998', N'2016-07-31T23:59:59.998', N'2016-08-31T23:59:59.998', N'2016-09-30T23:59:59.998', N'2016-10-31T23:59:59.998', N'2016-11-30T23:59:59.998', N'2016-12-31T23:59:59.998')

--Create Parttion SCHEME
CREATE PARTITION SCHEME [sch_SchedulerLog] AS PARTITION [FN_SchedulerLog] TO ([FG_SchedulerLog_06_16], [FG_SchedulerLog_07_16], [FG_SchedulerLog_08_16], [FG_SchedulerLog_09_16], [FG_SchedulerLog_10_16], [FG_SchedulerLog_11_16], [FG_SchedulerLog_12_16], [PRIMARY])


DROP INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )


CREATE UNIQUE NONCLUSTERED INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]


CREATE CLUSTERED INDEX [ClusteredIndex_on_sch_SchedulerLog_636102140668795637] ON [dbo].[SchedulerLog] 
(
    [Date]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [sch_SchedulerLog]([Date])


DROP INDEX [ClusteredIndex_on_sch_SchedulerLog_636102140668795637] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )



--- switching out data from any FGs to a switchout table for archiving purposes
--******************
--Create a switch out table: 
USE [ApplicationLogs]
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[staging_SchedulerLog_20160923-120700](
    [ID] [int] NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [HostName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [HostIP] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [ModuleName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Level] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Logger] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Message] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [FG_SchedulerLog_06_16]

USE [ApplicationLogs]
CREATE UNIQUE NONCLUSTERED INDEX [staging_SchedulerLog_20160923-120700_pkSchedulerLogId] ON [dbo].[staging_SchedulerLog_20160923-120700] 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [FG_SchedulerLog_06_16]
USE [ApplicationLogs]
ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700]  WITH CHECK ADD  CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1] CHECK  ([Date]<=N'2016-06-30T23:59:59')
ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700] CHECK CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1]


---Switch out partition
ALTER TABLE [dbo].[SchedulerLog] SWITCH PARTITION 1 TO [dbo].[staging_SchedulerLog_20160923-120700];
GO

エラー:ALTER TABLE SWITCH 'ステートメントが失敗しました。テーブル 'ApplicationLogs.dbo.SchedulerLog'はパーティション化されていますが、インデックス 'staging_SchedulerLog_20160923-120700_pkSchedulerLogId'はパーティション化されていません。

7
Djoe1

すべてのページのパーティション変更アドレスをターゲットテーブルに切り替えるため、(ソーステーブルで作成された)インデックスもターゲットテーブルに移動します。テーブルで使用可能なインデックスがパーティション化されていない場合、インデックスはターゲットに移動しません。

SWITCHパーティションを作成するときは、両方の(ソースとターゲット)テーブルに同じスキーマ(構造)、インデックス(パーティション化する必要があります)、およびCHECK制約があることを確認してください。

エラーによる

エラー:ALTER TABLE SWITCH 'ステートメントが失敗しました。テーブル 'ApplicationLogs.dbo.SchedulerLog'はパーティション化されていますが、インデックス 'staging_SchedulerLog_20160923-120700_pkSchedulerLogId'はパーティション化されていません。

インデックス[pkSchedulerLogId]はパーティション化されていません。

インデックスをパーティション分割した後

DROP INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )

CREATE UNIQUE NONCLUSTERED INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] 
(
    [ID] ASC
    ,[Date]
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
ON [sch_SchedulerLog]([Date])

そして

両方のテーブルにチェック制約を追加するか

ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700]  WITH CHECK ADD  CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1] CHECK  ([Date]<=N'2016-06-30T23:59:59')
ALTER TABLE [dbo].[SchedulerLog]  WITH CHECK ADD  CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_2] CHECK  ([Date]<=N'2016-06-30T23:59:59')

OR

ステージングテーブルから制約を削除します。

ALTER TABLE [staging_SchedulerLog_20160923-120700] DROP CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1];

これでパーティションを切り替えることができます

ALTER TABLE [dbo].[SchedulerLog] SWITCH PARTITION 1 TO [dbo].[staging_SchedulerLog_20160923-120700];

ありがとう

4
Rajesh Ranjan