在 Oracle SQL 的主键上声明附加索引时会发生啥?

Posted

技术标签:

【中文标题】在 Oracle SQL 的主键上声明附加索引时会发生啥?【英文标题】:What happens when declaring an additional index on the primary key in Oracle SQL?在 Oracle SQL 的主键上声明附加索引时会发生什么? 【发布时间】:2017-09-11 20:04:41 【问题描述】:

我有一个多部分的问题:

当我试图弄清楚我是否可以在 Oracle SQL 中使用降序/升序主键时,我的旅程就开始了。

似乎没有类似CREATE TABLE MYTAB (ID INT PRIMARY KEY DESC);CREATE TABLE MYTAB (ID INT, CONSTRAINT PK PRIMARY KEY(ID DESC)); 的语法

后来我了解到,Oracle 隐式地为主键创建索引以帮助强制执行其约束。我想我可以为它创建一个索引,并使索引降序。

CREATE INDEX MYIND ON MYTAB (ID DESC);

这很有效,当我查询存在哪些索引时,我得到了这个:

> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'MYTAB';

INDEX_NAME
------------------------------
SYS_C0011939
MYIND

我看到隐式创建的索引以及我自己的索引都在那里...我试图通过在表创建期间为主键创建索引来摆脱隐式创建的索引:

 CREATE TABLE MYTAB (ID INT PRIMARY KEY USING INDEX (CREATE INDEX MYIND ON MYTAB (ID ASC)));

这行得通:

> SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'MYTAB';

INDEX_NAME
------------------------------
MYIND

有趣的是,使用 DESC 作为索引方向会给我以下错误:

Specified index cannot be used to enforce the constraint.


所以我的问题是:

    这是否意味着在 Oracle SQL 中不能使用 DESCENDING 主键? 如果是这样,为什么 DESC 不允许强制执行主键约束? 在我的第一个示例中单独创建索引的行为/效果究竟是什么? DESC 在那里工作......当主键上有两个索引时会发生什么?它的功能是否与另一个数据库允许 DESC 作为主键规范的一部分相同?

【问题讨论】:

您认为为什么需要 DESC 索引? 我正在编写一个工具,它将为一堆不同的数据库生成语句 - 我正在研究允许用户指定升序/降序选项,并查看每个不同的数据库实现如何处理升序/降序指数。看来甲骨文不需要你说的 【参考方案1】:

Oracle 将索引创建为双链表,以便在需要时可以按升序或降序遍历每个索引。

但是,对于多列索引,您可以添加DESC 关键字,以使一个或多个列相对于其他列按降序存储。

它的用处有限且不经常使用 - 但当您专门创建索引以支持特定查询中的特定 ORDER BY 子句时,它可能很有用,其中某些(但不是全部)列按降序排序.

【讨论】:

以上是关于在 Oracle SQL 的主键上声明附加索引时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

通过在Oracle子表外键上建立索引提高性能

我需要在 Oracle 的外键上创建索引吗?

在cassandra的主键上匹配'like'的模式

主键上的非聚集索引?

oracle怎么查询所有的表有没有主键

为啥 eloquent 不会在不同的主键上返回错误?