我有一个与数据库理论相关的问题:
假设我们有一个包含 3 列的表:[PersonID], [PersonName], [PersonAge]
.
我们知道,当我们有一个一列的非聚集索引时,SQL Server会按照指定的列对表数据进行排序,并从中构建B+树。当我们需要使用这样的索引查找行时,SQL Server 通过比较一个原子数据对象(int
or string
, 例如)。很明显,当我们按一列构建非聚集索引时,它是如何工作并查找数据的(假设[PersonName]
),但是如果我们按 2 列创建非聚集索引会怎样:[PersonName]
and [PersonAge]
?
据我了解,在排序过程中最重要的标准是[PersonName]
如果多个记录具有相同的内容,那么它们将按以下顺序排序[PersonAge]
。但是 SQL Server 将如何根据该索引在物理上处理 B++ 树呢?
当它应该执行查询时,它将如何使用这样的树
SELECT *
FROM dbo.Person
WHERE [PersonName] = 'Bob' AND [PersonAge] = 45
谢谢你的解释。
非聚集索引与只有一列的索引几乎相同 - 但 B++ 导航树中的每个索引条目都将具有two列值(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 来找到您要查找的那个(或者可能找不到)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)