1

我为多对多关系创建了一个连接表。

该表只有 2 个列,ticketid并且groupid

典型的数据是

groupid    ticketid
20         56  
20         87
20         96
24         13
24         87
25         5

我的问题是在创建复合键时我应该ticketid遵循groupid

CONSTRAINT [PK_ticketgroup] PRIMARY KEY CLUSTERED 
    (
        [ticketid] ASC,
        [groupid] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

或以另一种方式,groupid然后ticketid

CONSTRAINT [PK_ticketgroup] PRIMARY KEY CLUSTERED 
        (
            [groupid] ASC,
                    [ticketid] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]

在选项 1 中搜索索引是否会更快,因为ticketid's它们比 groupid 更有可能是唯一的,并且它们将位于复合键的开头?或者这可以忽略不计?

4

2 回答 2

2

差异很可能可以忽略不计。

但是,对于 SQL Server,建议将最具选择性的列放在首位。如果首先放置选择性低的列,优化器可能会确定您的索引不是很有选择性,并会选择忽略它。有关详细信息,请参阅此sqlserverpedia.com Wiki 文章

于 2013-01-30T12:33:42.790 回答
0

我实际上会创建两个索引。鉴于工单 ID 更可能是唯一的,聚集索引将按该顺序为 GroupID,TicketID。然后我会在 TicketID 上创建一个非聚集非唯一索引。

原因是如果您只想根据组 ID 进行查询,它们在逻辑上将是连续的,并且会有一个块。仅指定 TicketID 时,另一个索引将为您提供最快的速度。

我确实认为根据查询数据的方式(即是否始终提供 groupid 和 ticketid),总体上它可能可以忽略不计。

于 2013-01-30T12:52:52.523 回答