2011-04-17 173 views
1

我创建了一个新的表与复合主键,让我们说PrmID和类型,因此一个新的复合聚集索引已创建(PrmID是第一)。我添加另一个非聚集索引类型。复合聚集索引和非聚集索引在sql server 2005

我的问题是 - 当我生成执行任何类型语句(如GROUP BY)的查询时,是使用非聚集索引表或PK聚集索引的SQL引擎(对于那种查询)?

+1

如果你的PK是'(PRIMID,类型)' ,那么仅仅使用'Type'(WHERE子句或GROUP BY)**的东西不能**使用该索引 - 这是没用的。所以这个查询肯定会使用NC索引 – 2011-04-17 13:27:47

回答

2

这取决于查询的样子,被访问什么什么之列,是它覆盖等

一个简单GROUP BY的类型将最有可能使用的NC指数。如果您使用其他列,您可能会收到书签/密钥查找或索引将被忽略,并且您将会有低效的PK扫描

1

我的理解是,当您有多字段索引并且您的查询是而不是使用索引中的第一个字段,那么该索引将不会被使用(太困难,效率不高等)。然后它将使用其他索引。

但是,要知道这绝对,与执行计划运行查询,甚至只是一个估计的执行计划。如果您使用SSMS,按下工具栏按钮很容易。它看起来像一个倒“L”形的三个蓝色和绿色小盒子。这会告诉你究竟使用了什么索引。尽管执行计划可以在查询的整个过程中发生变化(随着数据的变化),但它不应该用于这个答案。

3

- 编辑 -

感谢马克,我错过了......

- 编辑完 -

二是PRIMID真的没有你的表独特的,只有独特的结合类型?如果PrimID在表格中不重复,可以重新考虑将其制作为复合PK。

第三,回答这些类型问题的最佳方法是查看查询的执行计划。我们可以给你一个答案,我们如何认为 SQL应该处理该计划,但SQL Server将根据数据库中的数据,硬件等更改各种情况下的执行计划...

这是什么执行计划将看起来像: enter image description here

你可以看到,它会告诉你excatly其idexes使用,以及如何使用它们... here's an article that gives a good introduction into understanding the execution plans.

+1

OK,但是如果索引是on(PrimID,Type),并且你的查询只使用WHERE Type = ABC,那么这个索引是无用的,不会被使用。只有在使用从第一个列开始的任意数量的列时才会使用索引 - 如果在WHERE中使用第一列,使用第一个列和第二个列等等,则将使用索引,但是** NOT **如果您只使用索引中定义的第二列 – 2011-04-17 13:26:44