【问题标题】:Composite clustered index and non clustered index in sql server 2005sql server 2005 中的复合聚集索引和非聚集索引
【发布时间】:2011-04-17 12:48:32
【问题描述】:

我用复合主键创建了一个新表,比如说 PrmID 和 Type,因此创建了一个新的复合聚集索引(PrmID 是第一个)。我为 Type 添加另一个非聚集索引。

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

【问题讨论】:

  • 如果您的 PK 在 (PrimID,Type) 上,那么仅使用 Type(WHERE 子句或 GROUP BY)的东西不能使用该索引 - 它没用。所以该查询肯定会使用 NC 索引

标签: sql sql-server clustered-index composite-primary-key


【解决方案1】:

-- 编辑--

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

-- 结束编辑--

其次,PrimID在你的表中真的不是唯一的,只有结合Type才唯一?如果 PrimID 在表中没有重复,则可能重新考虑将其设为复合 PK。

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

执行计划如下所示:

你可以看到它准确地告诉你使用了哪些 idexes,以及它们是如何使用的......here's an article that gives a good introduction into understanding the execution plans.

【讨论】:

  • 好的,但是如果索引打开(PrimID,Type),并且您的查询只使用 WHERE Type = ABC,那么该索引是无用的并且不会被使用。仅当使用了从第一列开始的任意数量的列时才会使用索引 - 如果在 WHERE 中使用第一列,当使用第一列和第二列时等等 - 但是 NOT 如果您只使用索引中定义的第二列
【解决方案2】:

这取决于查询的外观、访问的列、是否覆盖等

简单的 GROUP BY 类型很可能会使用 NC 索引。如果您使用其他列,您可能会获得 bookmap/key 查找,否则索引将被忽略,并且您的 PK 扫描效率会很低

【讨论】:

    【解决方案3】:

    我的理解是,当您有一个多字段索引并且您的查询使用索引中的第一个字段时,则不会使用该索引(太难,效率不高等.) 然后它将使用另一个索引。

    但是,要明确了解这一点,请使用执行计划,甚至只是估计的执行计划来运行您的查询。如果您使用的是 SSMS,这就像按下工具栏按钮一样简单。它看起来像三个倒“L”形的蓝色和绿色小盒子。这将准确地告诉您正在使用什么索引。虽然执行计划可以在查询的整个生命周期中发生变化(随着数据的变化),但它不应该用于这个答案。

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2013-03-22
      • 2018-05-08
      • 2012-10-01
      • 2013-08-07
      • 2011-03-13
      • 2013-08-20
      相关资源
      最近更新 更多