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' 未分区。
因为将所有页的分区更改地址切换到目标表,所以它也会将索引(在源表上创建)移动到目标表。如果表上的可用索引不是分区索引,则不会移动到目标。
当我们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)
谢谢