PostgreSQL 有CLUSTER命令来对磁盘上的行进行物理分组。通过对经常一起访问的“相邻”行(没有更好的术语)的信息进行分组,性能得到提高,因为在给定查询中需要读取的磁盘块更少。Oracle 有类似的东西吗?如果有这样的选项,它甚至会有助于在几乎从不更新的大表上提高性能吗?
PostgreSQL 有CLUSTER命令来对磁盘上的行进行物理分组。通过对经常一起访问的“相邻”行(没有更好的术语)的信息进行分组,性能得到提高,因为在给定查询中需要读取的磁盘块更少。Oracle 有类似的东西吗?如果有这样的选项,它甚至会有助于在几乎从不更新的大表上提高性能吗?
Oracle 中的类似概念称为索引组织表(IOT)。
与 PostgreSQL CLUSTER 的不同之处在于,在 PostgreSQL CLUSTER 命令中重组表一次,之后表仍会按需要增长。在 Oracle IOT 中,其结构按索引排序。
与 Phil 不同,我时不时会看到物联网。当您需要通过索引检索许多(想想数百)行时,最常使用它们。
Oracle 有索引组织表、b 树集群和散列集群。Oracle 中的集群实现支持一个或多个表存储在同一个集群中。有关详细信息,请参阅AskTom。哪一个最适合您取决于您如何定义“相邻行”以及您如何访问数据。
我见过hash cluster对性能有很大的提升,但是很少用到,因为在创建cluster的时候必须指定key的数量。
最相似的 Oracle 功能是重新创建具有排序行的表。
这可以使用 DBMS_REDEFINITON 在线执行,但您可以更简单地:
它将提高基于索引范围的访问方法的效率,在这种方法中,通过有序列上的索引访问表,除非或直到表因插入更多行而变得杂乱无章。更新不会对此产生如此大的影响,因为 Oracle 通常不会像 PostgreSQL 那样仅仅因为行被更新而移动行。
索引组织的表、集群和分区都为强制行的物理集群提供了更永久的解决方案。
另一种相关技术是使用物化视图,它可以通过使用上述技术为原始表提供不同的行物理集群,并使用查询重写来选择具有最有用集群的表。