-1

我有一个关于一般 SQL 服务器如何存储其索引以及索引如何定位记录(行)的一般问题。在表上创建索引时,是否所有索引都存储在内存中?Sql server 启动时,是否所有索引都从磁盘加载到内存中?

另一个问题是,索引如何找到表中的行?是通过散列函数(例如找到索引)并将位置散列到磁盘上的某个位置吗?数据如何存储在磁盘中?按位置?这让我有点困惑,因为 Sql 服务器中的数据检索速度很快。

4

1 回答 1

1

聚集索引结构中描述:

在 SQL Server 中,索引被组织为B 树。索引 B 树中的每一页称为索引节点。B树的顶端节点称为根节点。索引中最底层的节点称为叶节点。根节点和叶节点之间的任何索引级别统称为中间级别。在聚集索引中,叶节点包含基础表的数据页。根和中间级节点包含保存索引行的索引页。每个索引行包含一个键值和一个指向 B 树中的中间级别页面或索引叶级别中的数据行的指针。索引的每一级中的页面都链接在一个双向链表中。

非聚集索引的组织方式与 B 树类似:

非聚集索引与聚集索引具有相同的 B 树结构,但有以下显着差异:

  • 基础表的数据行不会根据它们的非聚集键排序和存储。
  • 非聚集索引的叶层由索引页而不是数据页组成。

B 树在 Wikipedia 中有描述:

在计算机科学中,B 树是一种树形数据结构,它保持数据的排序并允许在对数时间内进行搜索、顺序访问、插入和删除。B-tree 是二叉搜索树的推广,一个节点可以有两个以上的子节点

Searching主题描述了b-tree 搜索算法:

搜索类似于搜索二叉搜索树。从根开始,树从上到下递归遍历。在每一层,搜索选择其分隔值位于搜索值任一侧的子指针(子树)。二进制搜索通常(但不一定)在节点内使用以查找感兴趣的分离值和子树。

至于内存中的内容与磁盘上的内容,请阅读缓冲区管理

缓冲区管理器管理从数据库磁盘文件读取数据或索引页到缓冲区高速缓存并将修改的页写回磁盘的功能。一个页面保留在缓冲区高速缓存中,直到缓冲区管理器需要缓冲区来读入更多数据。数据只有在被修改时才会写回磁盘。缓冲区高速缓存中的数据可以在写回磁盘之前多次修改。有关详细信息,请参阅阅读页面编写页面

于 2013-03-18T12:09:59.247 回答