我有表 ORDERS。其中有百万行。我需要在 Order 上添加 Pationed Index 以根据新的 IsLocked 字段将数据存储在两个文件之一中。但是当我检查表时,ISLocked 列上有一个非聚集索引.IsLocked 字段由 1 和 O 组成。你们能建议我最好的方法吗。
CREATE TABLE [Orders](
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[OrderNo] [varchar](50) NULL,
[AccountNo] [varchar](20) NULL,
[CompleteDate] date null,
[LastUpdateDate]) date null,
[AccountID] int NULL,
[IsWarranty] [bit] NULL,
[IsEmailAddressFound] [bit] NULL,
[IsLocked] [bit] NOT NULL,
[LinkOrderID] [int] NULL
)
Run Code Online (Sandbox Code Playgroud)
但已经有一个
CREATE NONCLUSTERED INDEX [IX_IsLockedAccountID] ON [coe].[Orders]
(
[IsLocked] ASC,
[AccountID] ASC
)
INCLUDE ( [OrderNo],
[CompleteDate],
[LastUpdateDate]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Orders IX_IsLockedAccountID NONCLUSTERED 72057594556710912 1 1146462
Run Code Online (Sandbox Code Playgroud)
你能帮我如何做分区,因为我是表分区的新手。
严格来说,在分区方案上创建非聚集索引与聚集索引完全一样,就像 Thomas 已经向您展示的那样:
CREATE NONCLUSTERED INDEX <indexname> ON <tablename>
(<columns>)
INCLUDE (<columns>)
ON <partitioning scheme>;
Run Code Online (Sandbox Code Playgroud)
通常不建议使用非对齐的非聚集索引,请参阅分区索引的特殊指南:
内存限制会影响 SQL Server 构建分区索引的性能或能力。如果该表已经应用了聚集索引,那么当索引与其基表不对齐或不与其聚集索引对齐时尤其如此。
类似的内存问题也出现在查询中,不仅在构建期间,特别是如果您使用 SQL Server 2012 之前的版本。
但真正的问题是用布尔值对非聚集索引进行分区是徒劳的。除了误解分区和滥用这个非常昂贵和侵入性的功能的一般问题(请参阅如何决定是否应该使用表分区),布尔分区是没有意义的,尤其是在看起来非常不稳定的列上(更改经常)和高度偏斜(0 比 1 多得多)。过滤索引可能是您所追求的。请参阅过滤索引与表分区。
最后,拥有“isLocked”列绝不是健康数据建模的标志。实际上是一个很大的代码气味。您可能需要阅读有关应用程序锁和/或使用表作为队列的信息。
看起来您只想在针对分区列的表上构建聚集索引
假设您已经定义了分区函数和模式,psBit(bit)
只需执行以下操作:
CREATE CLUSTERED INDEX CIX ON Orders (AccountId, IsLocked)
ON psBit(IsLocked)
Run Code Online (Sandbox Code Playgroud)
“魔法”是语句末尾的 ON 部分。如果 IsLocked 有点的话,可能最好把它放在最后。
请问在这种情况下你为什么要费心分区呢?一个1M行的表很小,没有理由对这么小的表使用分区。