2

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

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

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

我知道,在排序过程中,最重要的标准将是[PersonName],如果有几条记录相同,那么它们将按[PersonAge]. 但是,SQL Server 将如何根据该索引物理处理 B++ 树?

当它应该执行查询时它将如何使用这样的树

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

谢谢你的解释。

4

1 回答 1

2

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

由于两列是可比较的,因此将应用明确定义的排序 - 首先是 by PersonName,然后是 by 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 以找到您正在寻找的那个(或者它可能没有找到它)。

于 2014-12-09T20:03:12.577 回答