我有一个与数据库理论相关的问题:
假设我们有一个包含 3 列的表:[PersonID]、[PersonName]、[PersonAge]
。
我们知道,当我们有一个一列的非聚集索引时,SQL Server会按照指定的列对表数据进行排序,并从中构建B+树。当我们需要使用这样的索引查找行时,SQL Server 通过比较一个原子数据对象(例如 int
或 string
)来扫描 B++ 树。很明显,当我们按一列构建非聚集索引(假设 [PersonName]
)时,非聚集索引如何工作并查找数据,但是如果我们按 2 列创建非聚集索引会怎样: [PersonName]
和 [PersonAge]
?
据我所知,在排序过程中最重要的标准是[PersonName]
,如果多个记录具有相同的条件,那么它们将按[PersonAge]
排序。但是 SQL Server 将如何根据该索引在物理上处理 B++ 树呢?
当它应该执行像这样的查询时,它将如何使用这样的树
SELECT *
FROM dbo.Person
WHERE [PersonName] = 'Bob' AND [PersonAge] = 45
感谢您的解释。
最佳答案
非聚集索引与只有一列的索引几乎相同 - 但 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 以查找您正在寻找的一个(或者可能找不到)。
关于sql - 非聚集索引在 SQL Server 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27387603/