我正在尝试创建一个分区表,其中分区由OrderDate
. 我正在尝试创建一个clustered index
onOrderDate
和一个nonclustered primary key
on OrderID
。但我收到一条错误消息:
消息 1908,级别 16,状态 1,第 1 行列“OrderDate”是索引“PK_OrderID”的分区列。唯一索引的分区列必须是索引键的子集。消息 1750,级别 16,状态 0,行 1 无法创建约束。请参阅以前的错误。
如何修改它以使其工作:
CREATE TABLE dbo.Orders
(
OrderID INT NOT NULL ,
Name NVARCHAR(20) NULL ,
OrderDate DATE NOT NULL ,
)
ON PartSchemeOrders(OrderDate)
CREATE CLUSTERED INDEX IX_OrderDate
on dbo.Orders (OrderDate)
on PartSchemeOrders(OrderDate)
ALTER TABLE dbo.Orders
ADD CONSTRAINT PK_OrderID PRIMARY KEY NONCLUSTERED (OrderID)
正如错误消息所说,任何分区对齐的唯一索引都必须在索引键中包含分区键。存在此要求,因此引擎可以在更新时强制执行唯一性,而无需检查每个分区。
在您的情况下,这意味着包含
OrderDate
在非聚集索引键中,或具有非对齐索引。两者都是潜在的有效选择,具体取决于您的情况。为了保持对齐,您的表和索引定义将是:当然,这会改变非聚集索引强制执行的唯一性。现在,只有 和 的组合才能
OrderID
保证OrderDate
是唯一的。理论上可以添加重复OrderID
的s,只要OrderDate
不同。您是否可以接受这种语义变化取决于您的情况,但需要注意这一点。另一种方法是使非聚集主键不对齐:
这保留了单独的唯一性,并且对于使用索引进行计算或聚合的
OrderID
查询有一些好处,但是您失去了在不删除主键并在切换操作后重新创建主键的情况下进行分区的能力。MIN
MAX
SWITCH
您可以在联机丛书的这一部分阅读更多关于分区的信息,并在Remus Rusanu的这个优秀答案中阅读更多关于对齐和非对齐索引问题的信息。