2017-04-22 66 views
3

考虑下面的SQL Server表:使用群集与非群集索引上的大数据在SQL

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

其中ssn是首要的关键。

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

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

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

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

在这两种情况下应该使用哪种聚类或非聚类索引?

+0

在这两种情况下以及未来,无论有多少数据,我都会在SSN上添加一个集群,并在该集群上添加一个非集群。作为一项规则,非聚簇索引取决于您的查询。例如,如果您不在该表中按部门进行搜索,则不应创建它,否则请执行此操作。你不想为部门有一个单独的表吗? – hastrb

回答

1

我应该在这两个 个案中使用哪个聚类或非聚类指标?

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

执行计划应仅显示使用部门非聚集索引的索引查找,仅触及查询所需的数据。

0

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

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

如果50个部门有10000名员工,则在索引和数据之间反弹会更便宜。

查询优化器应该足够聪明来决定。

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

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