碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。
仍然让我困惑的是将表存储为平衡树的方法。在类似 Oracle 的 RDMS 堆中是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是真实的。每种方法的专家都声称他们的方法是唯一“正确”的,并支持通过大量测试/演示选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该用于大多数情况......
我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出相当的性能)并且下面有一些数学运算,但是我没有找到任何好的参考。
我意识到这个话题可能太宽泛而无法回答,非常欢迎好的链接,但我真的很想知道为什么两种看似有争议的方法都证明它们都是有效的。
当我开始我的 SQL Server DBA 职业生涯时,我处于同样的位置,但在我的大学主要学习 ORACLE (10g) ......以及 OCA 的东西......
我同意@KennethFisher 两个 RDBMS 是不同的,比较它们就像 - 比较苹果和橙子。
回答您关于 - 将表存储为平衡树的问题......
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:块中的行。
现在,当涉及到B+Tree索引时,这变得更加有趣和不同:
B+Tree 结构类似于 B-Tree 结构,但表记录(实际数据)存储在主键索引的叶节点中,允许对表的 PK 进行精确匹配或范围扫描搜索的快速访问。
Oracle 使用所谓的 IOT(索引组织表),而 SQL Server 使用所谓的聚集索引。
让我们看看聚集索引和索引组织表 (IOT) ...:
来自Oracle 文档,
索引组织表是存储在 B 树索引结构的变体中的表。在堆组织的表中,行插入到它们适合的位置。在按索引组织的表中,行存储在对表的主键定义的索引中。B 树中的每个索引条目还存储非键列值。因此,索引就是数据,数据就是索引。应用程序使用 SQL 语句操作索引组织的表,就像堆组织的表一样。
在 SQL Server 中,索引被组织为 B 树。索引 B 树中的每一页称为索引节点。B 树的顶部节点称为根节点。索引中最底层的节点称为叶节点。根节点和叶节点之间的任何索引级别统称为中间级别。在聚集索引中,叶节点包含基础表的数据页。根级和中间级节点包含保存索引行的索引页。每个索引行包含一个键值和一个指针,指向 B 树中的中间级别页面或索引的叶级别中的数据行。索引的每一级中的页面都链接在一个双向链表中。
最后一些很好的参考:
当我遇到值得一提的地方时,我会补充更多...