NonClustered Index如何在SQL Server中工作

时间:2014-12-09 19:53:00

标签: sql sql-server indexing b-tree non-clustered-index

我有一个与DB理论相关的问题:

我们假设我们有3列的表:[PersonID], [PersonName], [PersonAge]

我们知道,当我们有一列非聚集索引时,SQL Server会根据指定的列对表数据进行排序,并从中构建B +树。当我们需要使用这样的索引查找行时,SQL Server通过比较一个原子数据对象(例如intstring)来扫描B ++树。很清楚,非聚集索引如何工作并在我们通过一列构建时查找数据(假设为[PersonName]),但如果我们按2列创建非聚集索引,那该怎么办:[PersonName]和{{ 1}?

我理解,在排序标准中,主要重要性将是[PersonAge],如果有几条记录相同,那么它们将按[PersonName]排序。但是,基于这个索引,SQL Server在物理上如何处理B ++树?

当它应该执行像

这样的查询时,它将如何使用这种树
[PersonAge]

感谢您的解释。

1 个答案:

答案 0 :(得分:1)

非聚集索引与只有一列几乎相同 - 但B ++导航树中的每个索引条目都有两个列值(PersonName, PersonAge)

由于两个列都具有可比性,因此将应用明确定义的顺序 - 首先是PersonName,然后是PersonAge - 所以您的导航树项看起来像这样(如果看起来像一个单位列表):

Alice,42
Alice,57
Andrew,31
Anthony,23
...
...
Bertrand,48
Bob,34
Bob,39
Bob,44 
Bob,45
Bob,58
......
Zachary,19

运行查询时

SELECT * 
FROM dbo.Person 
WHERE [PersonName] = 'Bob' AND [PersonAge] = 45

然后SQL Server将导航B ++导航树 - 首先查看PersonName,直到找到所有出现的Bob,然后它扫描所有Bob以找到您要查找的那个(或者它可能找不到它。)