这是伪代码:
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)
我的问题是关于索引。我应该在哪里放置非聚集索引和聚簇索引? 优先顺序是哪个? (汇总?订单?其中?连接字段?)
答案 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和其他操作
WHERE
或ORDER BY
子句中使用的任何列也是一个很好的索引候选者。
但请注意:索引是一种艺术和平衡行为。每个附加索引都会增加更多开销 - 不要过度使用索引!越少越好。尝试
然后查看您的应用是否正常运行。如果确实如此 - 那就好了吧。如果不是:尝试隔离有问题的查询,并尝试调整这些查询。不要通过调整每个单独的查询来覆盖索引 - 一个可能使一个查询受益的索引会严重影响另一个查询。这是为整个应用程序找到最佳索引集的问题。
阅读Kim Tripp的博客文章 - 如果你有时间的话。她是索引女王,并提供了大量有关如何做(以及不做)的非常有价值的见解。