关于复合索引和基数的策略

时间:2009-12-11 20:28:28

标签: sql-server database sql-server-2005

基数在复合索引中起作用吗?如果是这样,什么?

我正在运行一个连接两列的查询,它使用了我认为是最优索引的,所以它让我重新思考我如何设计索引......

假设我们有一张表格列出了美国境内的所有城市。我的第一个本能就是在( - > 城市)上建立一个聚集索引,这样如果我们需要查询所有城市对于一个 State ,它可能会针对该索引。此外,对于指定城市的查询,这将是一个很好的索引(这里我们可以假设城市,州是唯一的对)。

我遇到了一个查询,该查询基本上是一个表格,其中列出了特殊城市。因此,这是城市表的子集。我在 Special.City Special.State 上指定了联接,但令我惊讶的是它使用了主键索引(由SQL服务器自动创建) 城市表而不是我制作的聚集索引。怎么样?

我也听说好的指数有很高的基数......

所以我想知道是否应该创建聚集索引(或另一个单独的索引)( City - > State )(注意顺序上的差异)因为(我们假设)只是城市具有较高的基数,并且比第一系列桶中的 State 更具辨别力。

根据我的经验法则,始终在父子关系中创建父级>子级的聚簇索引(如城市和州),以使针对特定子级的查询和获取给定父级的所有子级的查询受益。我需要在这里重新思考一下吗?

非正式测试表明(城市 - > )的指数比PK指数略低。

2 个答案:

答案 0 :(得分:1)

一些想法:

  • 当您加入“特殊城市”时,您是否要求“城市”中的所有栏目或城市和州?也就是说,它涉及的内容

  • “特殊城市”的索引或PK订单是什么?

  • 你有没有在任何地方过滤?

列的基数可以起到一定的作用:请参阅Craig Freedman's blog entry了解残差查找。并another one

它在BOL中提到(虽然找不到)它应该是最具选择性的

但是,在使用多层表和复合键的情况下,这会分崩离析。例如:

  • 表Grandad(GrandDadID,...)
  • 表爸爸(GrandDadID,DadID,...)
  • 表儿子(GrandDadID,DadID,SonID,......)

儿子的PK涵盖了两个父表的FK需求。

如果您反转“爸爸”和“儿子”的顺序,因为DadID和SonID应该是选择性的GrandDadID,那么您突然需要更多的索引来覆盖查询和FK DRI。

所以:列基数起了作用,但它只是一个因素而且,呃,“它取决于”......

答案 1 :(得分:0)

您正在处理的索引类型(与身份代理键上的munchkin PK相反)可能是一堆蠕虫。人们可以写几个小时的主题,并不一定会说任何可以帮助你的情况。阅读有关索引和进行大量实验的文章可能是您最好的选择。

没什么帮助,唉。如果我能想到任何简洁的普遍真理,我可能会在稍后更新。