sql - 非聚集索引在 SQL Server 中的工作原理

标签 sql sql-server indexing b-tree non-clustered-index

我有一个与数据库理论相关的问题:

假设我们有一个包含 3 列的表:[PersonID]、[PersonName]、[PersonAge]

我们知道,当我们有一个一列的非聚集索引时,SQL Server会按照指定的列对表数据进行排序,并从中构建B+树。当我们需要使用这样的索引查找行时,SQL Server 通过比较一个原子数据对象(例如 intstring)来扫描 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/

相关文章:

sql - 是否可以为 "Get largest 2"编写具有 O(n) 运行时复杂度的 T-SQL 查询?

jquery - 如何在jquery中选择selectedIndex的id

sql-server - SQL Server 索引 View

python - 获取两个单独查询之间的增量

sql - ORA-12560: TNS: 协议(protocol)适配器错误

sql - 如何有条件地选择 Oracle 查询中的列

indexing - 乌鸦数据库 4 RC2 : Cannot execute command of type PutAutoIndexCommand for database - Can not update auto-index:

c# - 更快上传到数据库

mysql - 在 MSSQL 和 MySQL 之间同步单表

c# - 当我将解决方案移动到另一个目录时,为什么在使用 "Database already exists"时得到 "AttachDbFileName"?