如何在 Oracle 中创建聚集索引和非聚集索引?

Pra*_*kar 13 oracle clustered-index

我就我的问题挖了几个小时,但没有得到满意的答案。我还是有疑问。我发现了以下关于聚集索引的信息:

  1. 数据按照聚集索引的顺序存储。
  2. 每个表只有一个聚集索引。
  3. 创建主键时,也会自动创建聚集索引。

我得到了这些点,但我的问题是:

  1. Oracle 数据库中是否存在聚集索引?因为我在一些博客中读到“Oracle 没有聚集索引的概念”。
  2. 如果是,请告诉我创建聚集索引sql 语句
  3. 如上所述,当在表的列上定义主键时,会自动创建聚集索引,如果创建与否如何检查索引类型?

请找到我的表架构:

在此处输入图片说明

让我知道是否需要其他任何内容才能获得这些问题的答案。

a_h*_*ame 21

Oracle 数据库中是否存在聚集索引?因为我读了一些博客

就在这里。

它被称为“索引组织表”(IOT)——在我看来这是更好的名字,因为它清楚地表明索引和表是同一个物理事物(这就是为什么我们只能有一个聚集索引在 SQL Server 中)

如果是,请告诉我创建簇索引的 SQL 语句。

create clustered index在 Oracle 中没有这样的东西。

要创建索引组织表,请使用create table带有organization index选项的语句。

在 Oracle 中,您通常将 IOT 用于非常窄的表。经常用于只包含主键列的表(例如 m:n 映射表),例如

create table assignment
(
   person_id  integer not null, 
   job_id     integer not null, 
   primary key (person_id, job_id)
)
organization index;
Run Code Online (Sandbox Code Playgroud)

您可以创建具有更多列的 IOT,在这种情况下,您需要将非 pk 列定义为“包含”列。例如,如果分配表应该有额外的列,比如不属于主键的开始和结束日期:

create table assignment
(
   person_id   integer not null, 
   job_id      integer not null, 
   start_date  date, 
   end_date    date,
   primary key (person_id, job_id)
)
organization index
including start_date
overflow storage (initial 4k);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息和示例,请参阅手册:https : //docs.oracle.com/database/121/SQLRF/statements_7002.htm#i2153235


有点不相关,但无论如何可能很有趣:

一篇有趣的博客文章质疑 SQL Server(和 MySQL)在创建表时使用聚集索引作为默认值的行为:

不合理的默认值:主键作为集群键

来自 Oracle 背景,我完全同意这一点。


ype*_*eᵀᴹ 10

我发现了以下关于聚集索引的信息:

  1. 数据按照聚集索引的顺序存储。
  2. 每个表只有一个聚集索引。
  3. 创建主键时,也会自动创建集群索引。

你挖了几个小时。您应该已经注意到,以上所有事实都是针对SQL Server不是 Oracle 的

Oracle 中的表(至少是普通表)没有聚集索引。有一种特殊的表,称为索引组织表 (IOT),它们具有类似的概念。Oracle 文档 (9i) 中的详细信息:索引组织表

什么是索引组织表?

与普通表相比,索引组织表具有自己的结构化、存储和索引数据的方式。与普通表的比较可能有助于解释其独特性。

索引组织表与普通表

普通表中的一行具有稳定的物理位置。一旦建立了这个位置,该行就永远不会完全移动。即使它随着新数据的添加而被部分移动,在原始物理地址处总是有一个行片 - 由原始物理 rowid 标识 - 系统可以从中找到该行的其余部分。只要该行存在,它的物理 rowid 就不会改变。普通表中的索引同时存储列数据和 rowid。

索引组织表中的行没有稳定的物理位置。它将数据按排序顺序保存在建立在表主键上的 B* 树索引的叶子中。这些行可以四处移动以保留排序顺序。例如,插入会导致现有行移动到不同的插槽,甚至移动到不同的块。

B*-tree 索引的叶子保存主键和实际行数据。对表数据的更改 - 例如,添加新行,或者更新或删除现有行 - 只会更新索引。

另请参阅最新的 Oracle 11g 版本中有关(11g):索引组织表的文档。