【问题标题】:Why a primary key automatically creates a clustered index为什么主键会自动创建聚集索引
【发布时间】:2013-08-30 08:00:17
【问题描述】:

当我在 oracle 表中创建主键时,为什么它默认创建一个“聚集”索引。在创建主键时自动创建聚集索引的原因是什么?这样设计oracle只是Oracle设计者的喜好吗?

【问题讨论】:

  • 什么是Clustered index?或者为什么这个问题标有Oracle
  • @Ivan 这是 Microsoft SQL 概念,Oracle 没有聚集索引。因此,这个问题是模棱两可的:OP 是否想知道为什么在添加 PK 时会创建索引?或者为什么要创建一个不存在的“聚集”索引?

标签: oracle database-design indexing primary-key clustered-index


【解决方案1】:

Oracle 将创建一个索引来监管不适合预先存在的索引的唯一约束。如果没有索引,每当有人尝试插入或删除行(或更新 PK)时,Oracle 都需要序列化操作(例如表锁)。

与 MS-SQL Server 不同,此索引在堆表(默认表组织)上不聚集,即此索引不会更改底层表结构和自然顺序。 Oracle 创建索引时不会对行重新排序。索引将是B-tree index,并将作为一个单独的实体存在,其中每个条目都指向主表中的一行。

Oracle 没有 MS SQL 那样的聚簇索引,但是 indexed-organized tables 与聚簇索引表共享一些属性。 PK 是此类表的组成部分,必须在创建期间指定。

(Oracle 也有table clusters,但它们是完全不同的概念)。

【讨论】:

  • 这就是为什么当您针对 SQL Server 开发应用程序时,您可以说 Select * from table,而针对 Oracle 您需要使用 Select * from table Order By...。因为当你有聚集索引 PK 时,它会自动为你排序。
  • @t.s.仅当您显然想要由 pk 排序的行 =) 另外,如果没有 ORDER BY 子句,我不会依赖自然排序:如果优化器更改其访问路径/方法会发生什么? (答案:你会得到乱序的行)
  • 这只是聚集索引对您的作用的一个例子:o)
【解决方案2】:

数据库引擎自动创建一个唯一索引来强制 PRIMARY KEY 约束的唯一性。如果表上不存在聚集索引或未显式指定非聚集索引,则会创建唯一的聚集索引以强制执行 PRIMARY KEY 约束。

阅读: http://www.sqlskills.com/blogs/kimberly/the-clustered-index-debate-continues/

【讨论】:

    【解决方案3】:

    创建索引是主键的基本功能,在 SQL Server 和 MySQL 中也是如此,聚集索引使您的搜索更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2012-12-21
      • 2010-12-07
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多