好吧,sql db 分区和切换似乎不是一个高度讨论的话题,但它是我正在实施的东西。我在分区功能、分区模式、文件组分配等所有领域都取得了成功。到目前为止,我没有遇到任何分区切换问题,直到发现一个讨厌的 xml 字段正在扼杀性能。所以我尝试添加一个简单的主 xml 分区,但现在所有分区切换都失败了。下面是我在玩的表结构的模拟。
CREATE TABLE [MySchema].[DataTable](
[PartitionKey] [varchar](12) NOT NULL,
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_DataTabe_Id] DEFAULT NewId(),
[ClientId] [smallint] NOT NULL,
[ProjectId] [int] NOT NULL,
[ResponseValue] [nvarchar](255) NULL,
[ResponseValueXml] xml NULL,
CONSTRAINT [PK_DataTable] PRIMARY KEY CLUSTERED
(
[PartitionKey] ASC
, [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS = ON)
ON PS_MySchema(PartitionKey)
) ON PS_MySchema(PartitionKey)
Run Code Online (Sandbox Code Playgroud)
对此的一些说明是,分区键是一个基于 clientId、年份和另一个值的复杂/计算键。分区模式建立在一个分区函数上,该函数将客户 + 日期分组,然后将它们放入单独的文件组(按年份) - 使滑动窗口方法易于管理。
事情的一般流程是在同一个文件组中创建一个工作表,使用alter table将所需的分区从DataTable切换到工作表。对着工作台做一些事情,完成后切换回去。这很好用......直到我在 ResponseValueXml 上添加一个主要的 xml 索引。alter table / switch 要求只允许 switch 的源有一个 xml 索引。所以,看来我可以将它切换到工作表(只要工作表没有 xml 索引)。但我似乎无法将其切换回来。如果我使用 DataTable 作为源,它会因为目标不能为空而出错。如果我使用 DataTable 作为目标,它会出现关于仅在源表上允许的 xml 索引的错误。
我在这里缺少什么?当我不允许切换它们时,我应该如何管理这个索引?任何指导表示赞赏。
这直接来自 BOL: 使用分区切换高效传输数据
XML 列必须具有相同的架构。任何 xml 列都必须键入同一 XML 架构集合。
目标表上不允许有 XML 索引。目标表上不能有 XML 索引。
看来您需要确保两个 XML 列都针对相同的架构键入,并从目标分区中删除 XML 索引(如果适用)。
我个人从未在涉及 XML 索引时执行过分区切换,因此可能不止于此。
希望这可以帮助,
马特