我有一个与DB理论相关的问题:
我们假设我们有3列的表:[PersonID], [PersonName], [PersonAge]
。
我们知道,当我们有一列非聚集索引时,SQL Server会根据指定的列对表数据进行排序,并从中构建B +树。当我们需要使用这样的索引查找行时,SQL Server通过比较一个原子数据对象(例如int
或string
)来扫描B ++树。很清楚,非聚集索引如何工作并在我们通过一列构建时查找数据(假设为[PersonName]
),但如果我们按2列创建非聚集索引,那该怎么办:[PersonName]
和{{ 1}?
我理解,在排序标准中,主要重要性将是[PersonAge]
,如果有几条记录相同,那么它们将按[PersonName]
排序。但是,基于这个索引,SQL Server在物理上如何处理B ++树?
当它应该执行像
这样的查询时,它将如何使用这种树[PersonAge]
感谢您的解释。
答案 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以找到您要查找的那个(或者它可能找不到它。)