我应该在 Oracle 中索引主键列吗

Posted

技术标签:

【中文标题】我应该在 Oracle 中索引主键列吗【英文标题】:Should I index primary key column(s) in Oracle 【发布时间】:2013-03-20 04:16:12 【问题描述】:

我最近停止认为主键不是索引,它们是唯一和空约束的组合。直到现在,我从未为 PK 列创建索引。我的问题是,如果要在许多查询的 WHERE 部分中使用此列,是否应该为 PK 列创建索引。

【问题讨论】:

主键编入索引。 要查看支持主键约束的索引:select ui.* from USER_CONSTRAINTS uc, USER_INDEXES ui where uc.table_name = 'MY_TABLE_NAME' and constraint_type = 'P' and ui.TABLE_OWNER = uc。 OWNER 和 ui.TABLE_NAME = uc.TABLE_NAME 和 ui.INDEX_NAME = uc.INDEX_NAME; Oracle 数据库通过在唯一键或主键上创建唯一索引来对表实施唯一键或主键完整性约束。启用约束时,该索引由数据库自动创建。 当您发出 CREATE TABLE 或 ALTER TABLE 语句来创建索引时,您不需要执行任何操作,但您可以选择指定一个 USING INDEX 子句来控制其创建。这包括定义和启用约束时,以及启用已定义但禁用的约束时。 【参考方案1】:

Oracle 将为您创建索引,或者可以使用现有的索引。使用唯一索引还是非唯一索引取决于您。

http://docs.oracle.com/cd/B28359_01/server.111/b28310/indexes003.htm#i1006566

主键本身不是索引,也不是唯一约束——它们都是约束。但是使用索引来支持它们。

唯一索引是完全不同的,因为它可以在没有唯一或主键约束的情况下存在,并且两种约束类型都不需要支持它的索引是唯一的。

【讨论】:

您好,我想问一个后续问题。如果主键有多个列,是为每列创建索引还是只为所有列的组合创建索引?例如,如果我有主键(custno,orderno,date)并且我想索引“orderno”,我是否需要仅在 orderno 上创建一个二级索引,或者它是否已经有一个由 Oracle 创建的二级索引,因为它是主键的一部分?我尝试搜索此内容,但找不到明确的答案。提前致谢! @Rash8151 会自动为这些列创建单个索引。

以上是关于我应该在 Oracle 中索引主键列吗的主要内容,如果未能解决你的问题,请参考以下文章

oracle:物化视图中的主键列

MySQL是不是自动索引外键列?

在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发

Oracle 从主键列中选择返回空值?

APEX 主键列被编辑替换

索引键列和包含性列