如何对非聚集索引列进行分区?

4 sql-server sql-server-2012

我有表 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)

你能帮我如何做分区,因为我是表分区的新手。

Rem*_*anu 7

严格来说,在分区方案上创建非聚集索引与聚集索引完全一样,就像 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”列绝不是健康数据建模的标志。实际上是一个很大的代码气味。您可能需要阅读有关应用程序锁和/或使用表作为队列的信息


Tho*_*ser 3

看起来您只想在针对分区列的表上构建聚集索引

假设您已经定义了分区函数和模式,psBit(bit)只需执行以下操作:

CREATE CLUSTERED INDEX CIX ON Orders (AccountId, IsLocked) 
ON psBit(IsLocked)
Run Code Online (Sandbox Code Playgroud)

“魔法”是语句末尾的 ON 部分。如果 IsLocked 有点的话,可能最好把它放在最后。

请问在这种情况下你为什么要费心分区呢?一个1M行的表很小,没有理由对这么小的表使用分区。