碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。
仍然让我感到困惑的是将表格存储为平衡树的方法。在类似 Oracle 的 RDMS 中,堆是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是正确的。每种方法的专家都声称他们的方法是唯一“正确”的方法,并通过一堆测试/演示来支持选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该在大多数情况下使用......
我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出可比的性能)并且在下面有一些数学,但我没有找到任何好的参考。
我意识到这个话题可能过于宽泛而无法回答,并且非常欢迎良好的链接,但我真的很想知道为什么两种看似有争议的方法已经证明它们都是有效的。
当我开始作为 SQL Server DBA 的职业生涯时,我处于相同的位置,但在我的大学里主要学习 ORACLE (10g) .. 以及 OCA 的东西......
我同意@KennethFisher 的观点,即两个 RDBMS 都不同,比较它们就像 - 比较 Apples 和 Oranges。
要回答您关于 - 将表格存储为平衡树的问题......
例如ROWID 和 UROWID 数据类型的参考概述
现在,当涉及到B+Tree索引时,这变得更加有趣和不同:
B+Tree 结构类似于 B-Tree 结构,但表记录(实际数据)存储在主键索引的叶节点中,允许快速访问表的 PK 上的精确匹配或范围扫描搜索。
Oracle 使用所谓的 IOT(索引组织表),而 SQL Server 使用所谓的聚集索引。
让我们看看聚集索引和索引组织表 (IOT) ...:
来自Oracle 文档,
从SQL Server 文档,
最后一些很好的参考:
当我遇到值得一提的时候,我会添加更多的点......
其实有一个相当简单的答案。Oracle 和类似的 RDBMS 被优化为使用堆,而 MS SQL Server 和类似的被优化为使用聚集索引。如果您查看每个系统的内部结构,您会发现它们的设计是为处理所选方法而构建的。因此,在这种特殊情况下,两组“专家”都是正确的。在具有聚簇索引的 SQL Server 表中运行得更好,在 Oracle 中堆工作得更好(通常在这两种情况下)。我不确定这两种方法总体上是好是坏,这只是 RDBMS 设计人员的偏好。根据我对 MS SQL Server 内部的了解(我还没有研究过 Oracle 的内部),我不确定您是否可以编写一个双向运行良好的 RDBMS。