语境
我一直在尝试表分区,发现了很多惊喜。我目前正在尽可能多地阅读文档,但文档数量多得令人震惊。我想我已经读完了六份白皮书中的第二份。我还没有在任何文档中看到过这个问题。
问题
使用DROP_EXISTING = ON
,似乎某些表可以就地分区。例如,我可以让它与唯一聚集索引一起工作。但是,我无法对主键执行相同的操作。本指南同意我的结论,并表示对具有主键的表进行分区需要先删除主键。这就像存在语法限制而不是功能限制。
我的问题是:什么时候可以对表进行分区而不在分区之前删除任何内容?换句话说,什么时候可以就地进行分区?
我并不是特意询问具体可以用什么方法做DROP_EXISTING
。那只是我偶然发现的一种方法。
假设 SQL Server 2022。我不在乎操作是否在线。对于类似的事情,我有一个不同的问题。
演示代码
CREATE PARTITION FUNCTION PF (integer)
AS RANGE RIGHT
FOR VALUES
(
10000, 20000, 30000, 40000, 50000
);
GO
CREATE PARTITION SCHEME PS
AS PARTITION PF
ALL TO ([PRIMARY]);
GO
CREATE TABLE dbo.T1
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
CONSTRAINT PK_T1
PRIMARY KEY CLUSTERED (c1, c2, c3)
);
CREATE TABLE dbo.T2
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
INDEX UIX_T2 UNIQUE CLUSTERED (c1, c2, c3)
);
GO
CREATE TABLE dbo.T3
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
INDEX UIX_T3 UNIQUE NONCLUSTERED (c1, c2, c3)
);
GO
/* These work */
CREATE CLUSTERED INDEX UIX_T2 ON dbo.T2 (c1, c2, c3)
WITH (DROP_EXISTING = ON) ON PS(C1)
GO
CREATE NONCLUSTERED INDEX UIX_T3 ON dbo.T3 (c1, c2, c3)
WITH (DROP_EXISTING = ON) ON PS(C1)
GO
/* But I could never get the primary key to! */
在上面,您可以就地对唯一索引进行分区。但是,我还没有想到可以尝试对主键起作用的方法。我非常确定也REBUILD
可以。
您可以使用
CREATE INDEX...WITH DROP_EXISTING=ON
语法对现有主键约束或唯一约束索引进行分区,类似于对非约束索引进行分区。需要注意的是,指定的索引键定义必须与现有约束键匹配,分区列必须是唯一索引键的一部分(所有唯一分区索引都要求如此),并且聚集/非聚集规范必须与现有索引相同。此代码将对示例 DDL 的主键约束索引进行分区。