表分区切换出问题

Djo*_*oe1 7 index sql-server sql-server-2008-r2 partitioning

请帮忙!我从我设置的分区切换出时出错。我有下面的脚本和错误信息:

我为每个范围创建了单独的文件组

--创建分区函数

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
Run Code Online (Sandbox Code Playgroud)

错误:ALTER TABLE SWITCH' 语句失败。表 'ApplicationLogs.dbo.SchedulerLog' 已分区,而索引 'staging_SchedulerLog_20160923-120700_pkSchedulerLogId' 未分区。

Raj*_*jan 5

因为将所有页的分区更改地址切换到目标表,所以它也会将索引(在源表上创建)移动到目标表。如果表上的可用索引不是分区索引,则不会移动到目标。

当我们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])
Run Code Online (Sandbox Code Playgroud)

要么向两个表添加检查约束

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')
Run Code Online (Sandbox Code Playgroud)

或者

从临时表中删除约束。

ALTER TABLE [staging_SchedulerLog_20160923-120700] DROP CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1];
Run Code Online (Sandbox Code Playgroud)

现在您将能够切换分区

ALTER TABLE [dbo].[SchedulerLog] SWITCH PARTITION 1 TO [dbo].[staging_SchedulerLog_20160923-120700];
Run Code Online (Sandbox Code Playgroud)

谢谢