我创建了一个带有复合主键的新表,让我们说PrmID和Type,因此创建了一个新的复合聚簇索引(PrmID是第一个)。我为Type添加了另一个非聚簇索引。
我的问题是 - 当我生成一个在Type上执行任何语句的查询(例如GROUP BY)时,SQL引擎是使用非聚集索引表还是PK聚簇索引(对于那种查询来说更贵) ?
答案 0 :(得分:3)
- 编辑 -
谢谢马克,我错过了......
- 结束编辑 -
第二,PrimID在你的表中是不是唯一的,并且只与Type结合使用?如果表中没有重复PrimID,可能会重新考虑将其作为复合PK。
第三,回答这些类型问题的最佳方法是查看查询的执行计划。我们可以给出一个关于我们认为 SQL应该如何处理该计划的答案,但是SQL Server将根据数据库中的数据,硬件等改变各种情况的执行计划...... / p>
以下是执行计划的样子:
你可以看到,它会激动地告诉你使用了哪些idex,以及它们的使用方式...... here's an article that gives a good introduction into understanding the execution plans.
答案 1 :(得分:2)
这取决于查询的外观,访问的列,覆盖等等
简单的GROUP BY类型很可能使用NC索引。如果您使用其他列,您可能会获得bookmap / key lookup或索引将被忽略,并且您将进行低效的PK扫描
答案 2 :(得分:1)
我的理解是,如果你有一个多字段索引并且你的查询不使用索引中的第一个字段,那么将不会使用该索引(太难,效率不高等等) 。)然后它将使用另一个索引。
但是,要明白这一点 ,请使用执行计划运行查询,甚至只执行估算的执行计划。如果您使用的是SSMS,则按下工具栏按钮很简单。它是一个看起来像一个倒“L”图案的三个小蓝色和绿色盒子。这将告诉您究竟使用了什么索引。虽然执行计划可以在查询的生命周期内发生变化(随着数据的变化),但不应该为此答案。