我创建了一个具有复合主键的新表,可以说是 PrmID 和 Type,因此创建了一个新的复合聚集索引(首先是 PrmID)。我为 Type 添加了另一个非聚集索引。
我的问题是 - 当我生成对类型(例如 GROUP BY)执行任何语句的查询时,SQL 引擎是使用非聚集索引表还是 PK 聚集索引(对于那种查询来说更昂贵)?
我创建了一个具有复合主键的新表,可以说是 PrmID 和 Type,因此创建了一个新的复合聚集索引(首先是 PrmID)。我为 Type 添加了另一个非聚集索引。
我的问题是 - 当我生成对类型(例如 GROUP BY)执行任何语句的查询时,SQL 引擎是使用非聚集索引表还是 PK 聚集索引(对于那种查询来说更昂贵)?
- 编辑 -
谢谢马克,我错过了...
-- 结束编辑 --
其次,PrimID在你的表中真的不是唯一的,只有结合Type才唯一?如果 PrimID 在表中没有重复,则可能重新考虑将其设为复合 PK。
第三,回答这类问题的最佳方法是查看查询的执行计划。我们可以给你一个关于我们认为SQL 应该如何处理计划的答案,但是 SQL Server 会根据你的数据库中的数据、你的硬件等中的数据来改变各种情况下的执行计划......
执行计划如下所示:
您可以看到它明确地告诉您使用了哪些 idex,以及它们是如何使用的……这里有一篇文章很好地介绍了理解执行计划。
这取决于查询的外观、访问的列、是否覆盖等
一个简单的 GROUP BY 类型很可能会使用 NC 索引。如果您使用其他列,您可能会得到一个 bookmap/key 查找,否则索引将被忽略,并且您将进行低效的 PK 扫描
我的理解是,当您有一个多字段索引并且您的查询没有使用索引中的第一个字段时,则不会使用该索引(太难,效率低等),然后它将使用另一个索引。
但是,要明确知道这一点,请使用执行计划,甚至只是估计的执行计划来运行您的查询。如果您使用的是 SSMS,这就像按下工具栏按钮一样简单。它看起来像三个倒“L”形的蓝色和绿色小盒子。这将准确地告诉您正在使用什么索引。虽然执行计划可以在查询的整个生命周期中发生变化(随着数据的变化),但它不应该用于这个答案。