长期使用SQLServer之后,我常常认为与堆表相比,聚簇表(具有聚簇索引的表)通常是更好的选择。现在我也在使用Oracle,我真的不明白为什么他们的表默认是堆。根据我的经验,我可以说表中应该堆的数量有限(再次,我主要处理SQLServer)。
Oracle是否有充分的理由“强制”(强迫我的意思是CREATE TABLE
而不指定organization index
创建堆而不是SQLServer(默认情况下创建聚簇表)用户使用堆表?
[更新]
关于SQLServer的澄清 - 我可能误用“default”来描述SQL Server行为;我知道如果CREATE TABLE
中指定了主键,它会创建一个聚簇索引。我的观点是,我没有必要指定PK是聚集的
的 [/更新]
此外,在SQLServer中有很多关于集群表和堆的好文章,我想知道它可以在多大程度上应用于Oracle。
非常感谢任何信息。
感谢。
答案 0 :(得分:5)
Oracle的一个历史优势是其行级锁定机制,其中锁存储在数据行中(而不是存储在内存中或单独的结构中)。这意味着从来没有必要“最小化”事务中的锁数,也没有将行锁升级到页面(或表锁)的概念。
它的并发和恢复机制还允许它将未提交的数据写入磁盘,而不是将它们保存在内存中。
这些可以缓解群集/ btree结构化表格也可以解决的相同问题。
简而言之,Oracle中的堆表与其他数据库中的堆表没有相同的问题,因此在同一物理块中共同定位相关数据并没有获得相同的好处。
答案 1 :(得分:2)
我在Oracle工作很多,根据我的经验,IOT(=类似BTree)的成本会中和或超过可能的收益...
在Oracle术语中,“集群”和IOT / Btree是不同的野兽 - 我不太了解SQL Server,但认为“集群”意味着与Oracle中的含义不同...这更像是一个案例决定......虽然我喜欢坚持默认并根据需要进行优化......
有关Oracle / Index信息的一些链接: