集群表与非集群表

a1e*_*x07 7 clustered-index

碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。

仍然让我困惑的是将表存储为平衡树的方法。在类似 Oracle 的 RDMS 堆中是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是真实的。每种方法的专家都声称他们的方法是唯一“正确”的,并支持通过大量测试/演示选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该用于大多数情况......

我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出相当的性能)并且下面有一些数学运算,但是我没有找到任何好的参考。

我意识到这个话题可能太宽泛而无法回答,非常欢迎好的链接,但我真的很想知道为什么两种看似有争议的方法都证明它们都是有效的。

Kin*_*hah 5

当我开始我的 SQL Server DBA 职业生涯时,我处于同样的位置,但在我的大学主要学习 ORACLE (10g) ......以及 OCA 的东西......

我同意@KennethFisher 两个 RDBMS 是不同的,比较它们就像 - 比较苹果和橙子。

回答您关于 - 将表存储为平衡树的问题......

  • Oracle 和 SQL Server 都支持B 树索引,它保持数据排序并允许在对数时间内进行搜索、顺序访问、插入和删除。
  • B-Tree 针对读写大数据块的系统进行了很好的优化。请注意,SQL Server 将这种结构用于非聚集索引,而 Oracle 使用它作为内部存储表的存储位置的默认结构。
  • Oracle 有ROWID(行 ID)和 UROWID(通用行 ID)的概念,其中包含键值和对记录存储位置的唯一引用,这表示记录存储在磁盘上的物理位置。

例如ROWID 和 UROWID 数据类型的参考概述

SELECT ROWID, last_name FROM employees WHERE department_id = 20; 

ROWID              LAST_NAME 
------------------ ---------- 
AAAAaoAATAAABrXAAA BORTINS 
AAAAaoAATAAABrXAAE RUGGLES 
AAAAaoAATAAABrXAAG CHEN 
AAAAaoAATAAABrXAAN BLUMBERG 
Run Code Online (Sandbox Code Playgroud)

扩展的 rowid 具有四段格式,OOOOOOFFFBBBBBBRRR:

OOOOOO:标识数据库段的数据对象编号(示例中为 AAAAao)。同一段中的模式对象,例如一组表,具有相同的数据对象编号。

FFF:包含行(示例中的文件 AAT)的数据文件的表空间相关数据文件编号。

BBBBBB:包含行的数据块(示例中的块 AAABrX)。块编号与其数据文件相关,而不是表空间。因此,具有相同块号的两行可以驻留在同一表空间的两个不同数据文件中。

RRR:块中的行。

  • 因此,RDBMS - ORACLE 和 SQL Server 中的概念完全不同。此外,在 Oracle 中创建的 PK 只不过是具有 ROWID 的平衡非聚集索引,用于快速访问,因此没有聚集索引或非聚集索引的概念。

现在,当涉及到B+Tree索引时,这变得更加有趣和不同:

  • B+Tree 结构类似于 B-Tree 结构,但表记录(实际数据)存储在主键索引的叶节点中,允许对表的 PK 进行精确匹配或范围扫描搜索的快速访问。

  • Oracle 使用所谓的 IOT(索引组织表),而 SQL Server 使用所谓的聚集索引。

让我们看看聚集索引和索引组织表 (IOT) ...:

来自Oracle 文档

索引组织表是存储在 B 树索引结构的变体中的表。在堆组织的表中,行插入到它们适合的位置。在按索引组织的表中,行存储在对表的主键定义的索引中。B 树中的每个索引条目还存储非键列值。因此,索引就是数据,数据就是索引。应用程序使用 SQL 语句操作索引组织的表,就像堆组织的表一样。

在此处输入图片说明

SQL Server Doc

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

在此处输入图片说明

  • IOT 的统计信息包括行的物理散布,而 SQL Server 不包括统计信息中行的物理位置,因此 SQL Server 中的聚集索引比 HEAP 更好 - 数据按聚集键排序,并获得了对数据的良好估计被搜索。

最后一些很好的参考:

当我遇到值得一提的地方时,我会补充更多...