复合键SQL服务器

时间:2013-01-30 12:24:23

标签: sql sql-server sql-server-2008 indexing key

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

表格中只有2个字母,ticketidgroupid

典型的数据是

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,它们会在复合键的开头?或者这可以忽略不计?

2 个答案:

答案 0 :(得分:2)

这种差异很可能是微不足道的。

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

答案 1 :(得分:0)

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

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

我认为根据查询数据的方式总体上可能会忽略不计(即如果总是提供groupid和ticketid)。