我为多对多关系创建了一个连接表。
表格中只有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
更有可能是唯一的,然后是groupids,它们会在复合键的开头?或者这可以忽略不计?
答案 0 :(得分:2)
这种差异很可能是微不足道的。
但是,建议SQL Server将最具选择性的列放在第一位。如果首先放置具有低选择性的列,优化程序可能会确定您的索引不是非常有选择性,并会选择忽略它。有关详细信息,请参阅此sqlserverpedia.com Wiki Article。
答案 1 :(得分:0)
我实际上会创建两个索引。鉴于票证ID更可能是唯一的,聚集索引将按顺序为GroupID,TicketID。然后我会在TicketID上创建一个非聚集的非唯一索引。
原因在于,如果您只想基于组ID进行查询,那么它们在逻辑上是连续的,并且会有一个块。当仅指定TicketID时,另一个索引将为您提供最快的速度。
我认为根据查询数据的方式总体上可能会忽略不计(即如果总是提供groupid和ticketid)。