我应该把索引放在哪里?

时间:2011-08-13 15:35:09

标签: sql-server sql-server-2005 sql-server-2008

这是伪代码:

Select 
    count(score) 
from 
   myTable
join 
   HisTable on myTAble.id = HisTable.id 
where 
   name='aaa'
group by 
   id 
having 
   count(score) > 3 
order by 
   (someField)

我的问题是关于索引。我应该在哪里放置非聚集索引和聚簇索引? 优先顺序是哪个? (汇总?订单?其中?连接字段?)

1 个答案:

答案 0 :(得分:3)

在SQL Server中,有几个基本注意事项:

  • 群集密钥非常重要,应该谨慎选择 - 它应该是狭隘的,独特的,静态的,并且可能不断增加( NUSE 原则) - 请参阅Kim Tripp的Ever-increasing clustering key - the Clustered Index Debate..........again!博客文章,了解有关这些特征为何重要的更详细信息。

    所以你的聚类键应该是窄的 - 4字节INT是理想的,它应该是 UNIQUE 和静态,这完全由某种ID处理 - 特别是如果这是一个INT IDENTITY。 GUID明显更糟,可变宽度VARCHAR字段绝对不可能

  • 引用父表的子表中的每个外键列都应该是非聚簇索引的一部分。这显着加快了JOIN和其他操作

  • WHEREORDER BY子句中使用的任何列也是一个很好的索引候选者。

但请注意:索引是一种艺术和平衡行为。每个附加索引都会增加更多开销 - 不要过度使用索引!越少越好。尝试

  • 选择良好群集密钥
  • 在每个外键列上放置非聚簇索引

然后查看您的应用是否正常运行。如果确实如此 - 那就好了吧。如果不是:尝试隔离有问题的查询,并尝试调整这些查询。不要通过调整每个单独的查询来覆盖索引 - 一个可能使一个查询受益的索引会严重影响另一个查询。这是为整个应用程序找到最佳索引集的问题。

阅读Kim Tripp的博客文章 - 如果你有时间的话。她是索引女王,并提供了大量有关如何做(以及不做)的非常有价值的见解。