什么是聚集索引表?

4
我可能错了,但是在互联网上似乎有不同的观点。SQL Server、MySQL、DB2和PostgreSQL对这些表的定义不同。
阅读了来自不同供应商(数据库手册、用户帖子等)的大量信息后,我能区分出三种感兴趣的表类型(对于这个问题来说,还有许多其他没有兴趣的表类型)。请耐心听我解释:
1. 堆表: - 所有行都存储在堆表中(可能无序)。 - 每行都有一个内部的ROWID来标识它。 - 索引是可选的。如果添加了索引,则包括索引列作为索引键以及ROWID(最终访问堆中的实际行)。 - 注意:这种情况对于这个问题没有兴趣,但我把它加在这里是为了和下面的第三种情况区别开来。
2. 纯索引表:<-- 这是一个聚集索引表吗? - 有一个主要的索引,包括关键列和非关键列。所有数据都存储在索引中。 - 数据按照主索引顺序排序,因此默认按主索引排序。 - 不需要堆表来存储行。所有数据已经在索引中。由于没有堆表,因此没有ROWID。 - SQL Server表(通常)默认属于此类别。 - MySQL InnoDB表似乎也属于此类别,因为它们似乎根本没有堆表。
3. 索引+排序堆表:<-- 这是一个聚集索引表吗? - 有一个主要的“聚集索引”。 - 有一个堆表,其中按照聚集索引定义的顺序存储行。 - 堆表中的每一行都有一个ROWID。 - 聚集索引不包括非关键列,但包括一个ROWID来访问堆表中的实际行。 - DB2似乎能够将表“聚集”起来。 - PostgreSQL似乎也将这些表称为“聚集索引”表。
现在,这2个或3个中哪个是“聚集索引表”?谁在说真话,谁在撒谎? :D
换句话说,术语“聚集索引表”是每个供应商随意定义的商业术语,还是根据某个官方数据库理论有一个唯一的官方定义?

也可以参考以下链接:https://dba.stackexchange.com/questions/34236/clustered-index-in-sql-server-vs-index-organized-tables-in-oracle - Vao Tsun
1个回答

2
据我所知,“聚集索引”是一种索引,其中索引的叶节点是数据页。这与非聚集索引不同,非聚集索引的叶节点是对存储在数据页上的行的引用。
一个表最多只能有一个聚集索引。在具有聚集索引的表中,数据按索引键排序。
Postgres不支持聚集索引。它有一种名为“cluster”的表优化,根据索引对数据进行排序。但是,这种排序不能保持不变,因此与聚集索引不同。

那么您的意思是聚集索引永远不会有堆表。DB2与PostgreSQL的工作方式相同,需要积极维护以保持行的准排序。这是否意味着DB2和PostgreSQL没有实现真正的聚集索引? - The Impaler
据我所了解,DB2实现了真正的聚集索引(https://www.ibm.com/support/knowledgecenter/zh/SSEPEK_10.0.0/intro/src/tpc/db2z_clusteringindexes.html)。@TheImpaler - Gordon Linoff
1
索引与非聚索引。这个问题非常非常广泛。 - Shadow
谢谢@Shadow,我认为这就是混淆的根源。Clustered Index Tables在SQL Server(默认类型),MySQL(作为InnoDB表)和Oracle(作为IOTs)中可用。PostgreSQL和DB2实现Clustering索引(类似的名称),但它们的工作方式不同。 - The Impaler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接