我有一个与数据库理论有关的问题:
假设我们的表格有3列:[PersonID], [PersonName], [PersonAge]。
[PersonID], [PersonName], [PersonAge]
我们知道,当我们使用一列的非聚集索引时,SQL Server会根据指定的列对表数据进行排序,并从中建立B +树。而当我们需要找到使用这种指数的行,SQL服务器通过比较一个原子数据对象(扫描基础B +树int或者string,例如)。这是明确的,指数如何非集群工程和查找数据时,我们通过一列(假设构建它[PersonName]),但是如果我们通过2列上创建非聚集索引:[PersonName]和[PersonAge]?
int
string
[PersonName]
[PersonAge]
我了解,在排序标准中,最重要的条件是[PersonName],如果多个记录具有相同的标准,则将按进行排序[PersonAge]。但是,基于该索引,SQL Server在物理上如何处理B ++树?
当它执行查询时它将如何使用这样的树
SELECT * FROM dbo.Person WHERE [PersonName] = 'Bob' AND [PersonAge] = 45
感谢您的解释。
非聚集索引将与只有一个列几乎相同-但是B ++导航树中的每个索引条目将具有 两个 列值(PersonName, PersonAge)。
(PersonName, PersonAge)
由于两列都是可比较的,因此将应用明确定义的顺序- 首先按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
当您运行查询时
然后SQL Server将导航B ++导航树- 首先查看PersonName,直到找到的所有出现Bob,然后扫描所有的Bob来查找您要查找的(或者可能找不到)。
Bob