随机顺序列上的聚集索引

LCJ*_*LCJ 2 index sql-server clustered-index

我的系统中有一个名为“Orders”的现有表。OrderID 是这个表中的主键——它是一个聚集索引。我为“OrderCompanyDetails”设计了一个新表,如下所示。它1-to-1 与 Orders 表有关系。在新表中,OrderID 被保留为集群主键。

只有在订单获得批准后,数据才会插入到新表中。因此插入到新表中的 OrderID 可能不是按顺序排列的。OrderID 10 可能会在 OrderID 5 之前插入,具体取决于哪个订单首先被批准。

在 OrderID 上拥有聚集索引有助于我的查询。但是聚集索引位于以随机序列获取数据的列上。这是一个糟糕的索引设计吗?如果是,我是否应该添加一个名为 OrderCompanyDetailID 的新无意义标识列并将其设为聚集索引?

CREATE TABLE [dbo].[Orders]
(
    [OrderID] [int] IDENTITY(1,1) NOT NULL,
    [OrderType] [char](3) NOT NULL,
    [StatusCD] [char](10) NOT NULL,
    [CreatedOnDate] [datetime] NOT NULL CONSTRAINT [DF__Orders__CreatedOn]  DEFAULT (getdate()),
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
    (
        [OrderID] ASC
    )
)

CREATE TABLE [dbo].[OrderCompanyDetails](
    [OrderID] [int] NOT NULL,
    [POCompanyCD] [char](4) NULL,
    [VendorNo] [varchar](9) NULL,
    [CreatedOnDate] [datetime] NOT NULL CONSTRAINT [DF_OrderCompanyDetails_CreatedOn]  DEFAULT (getdate()),
    CONSTRAINT [PK_OrderCompanyDetails] PRIMARY KEY CLUSTERED 
    (
        [OrderID] ASC
    )
)
Run Code Online (Sandbox Code Playgroud)

更新

最近阅读文章不断增加的聚集键——聚集索引辩论………….再次!. 里面有评论

请记住——狭窄的、静态的、独特的、不断增加的——通常是代理键而不是自然键。

Tar*_*zer 5

对聚集索引的建议是它们不断增加或不断减少,但这并不意味着它们必须如此。除非您使用顺序 GUID,否则 GUID 不会增加或减少。大多数人不使用顺序 GUID。

如果您担心分页会影响性能,请在需要分页之前降低填充因子以容纳更多插入。如果 GUID 是聚集索引(我不是说它应该是聚集索引,我是说如果是),那么这也是对 GUID 的建议。请注意降低它的程度,因为它会影响读取性能,这可能对您很重要,因为您提到 OrderID 上的聚集索引有助于您的查询。