在SQL

时间:2017-04-22 17:32:31

标签: sql-server indexing

给出以下SQL Server表:

  • 员工(ssn,姓名,部门,经理,薪水)

其中ssn是主键。

假设每个磁盘块有30个员工记录。每个员工都属于其中一个部门。在以下两种情况下,解释为什么您应该或不应该在dept上放置非群集索引来加速此查询:

SELECT ssn
FROM Employee
WHERE dept = 'IT'
  • 当有50个部门时
  • 当有5000个部门时

我对SQL Server中的聚簇索引与非聚簇索引的基本理解是,当要返回大量数据时应使用聚簇索引,因为它们最初将按该索引对表进行排序。因此,我认为在第二种情况下,对于5000个部门,您不应dept上放置非聚类索引以加快查询速度。

我对第一种情况感到困惑,因为只有50个部门,如果使用非聚类或聚类索引真的很重要吗?我认为它可能重要的唯一原因是聚类索引是否需要额外的时间来对数据进行第一次排序,而非聚类索引则不需要。

在这两种情况下,我应该使用哪种群集或非群集索引?

2 个答案:

答案 0 :(得分:1)

  

我应该在这两者中使用哪种群集或非群集索引   例

使用SSN作为主键聚簇索引,dept上的非聚集索引将覆盖查询,并且无论返回的行数如何,都是最有效的。请记住,聚簇索引键(此处为主键)隐式包含在非聚集索引叶节点中作为行定位器。这将避免访问包含查询不需要的列的单独数据页。

执行计划应该只显示使用dept non-clustered索引的索引查找,只触及查询所需的数据。

答案 1 :(得分:0)

问题是缺少一个重要参数 - 有多少员工?

如果50个部门中有100名员工,则扫描数据比在索引和数据之间反弹更便宜。

如果50个部门有10000名员工,那么在索引和数据之间跳转会更便宜。

查询优化器应该足够智能来决定。

还取决于是否' IT'是一个大部门。

底线:有索引,并希望优化器不会搞砸它。