sql - 我应该添加主键列作为 Oracle RDBMS 中索引的最后一列吗?

标签 sql database oracle indexing rdbms

我正在针对某些带有索引的查询优化 Oracle 数据库,但我突然想到了一个问题。

如果我有一个像这样的表(ID 是主键):

|ID |A
--------
|3  |10
|2  |20
|5  |10
|4  |20
|1  |10

我为A列添加了一个索引,我应该得到这样的结果

|A  |ID
--------
|10 |3
|10 |5
|10 |1
|20 |2
|20 |4

由于我只为 A 列创建了索引,因此我希望该索引中 A 的每个值的 ID 都是无序的。这应该是低效的,因为我们理想情况下想要有序的 ID 就像

|A  |ID
--------
|10 |1
|10 |3
|10 |5
|20 |2
|20 |4

我应该通过为 (A,ID) 创建索引来明确指定这一点吗?这样做的主要好处是更容易对结果进行连接和子过滤。 IE。

WHEN a = 10 AND id > 3

因为这看起来很明显,而且我不记得有任何书推荐过这一点,直觉告诉我,RDBMS 已经默认对所有索引执行此操作,但我想确定一下。有对此主题有更多了解的人可以发表评论吗?

更新。链接的问题根本不涉及联接,并且不回答给定的问题。下面的马库斯·温南德评论回答了这个问题。答案是 - 如果您要使用 WHERE(例如,如果您在没有 ROWNUM 的情况下进行分页,如此处所述 link ),那么它确实有意义,但不会使联接受益,除非它们非常具体 sort-merge joins ,这仅在非常大的表上才有意义,并且需要一些额外的调整才能实现。

最佳答案

索引 order by 子句确实是可能的,有时也是防止排序的好方法:

http://use-the-index-luke.com/sql/sorting-grouping/indexed-order-by

但是,for 连接稍微复杂一些。看看这些:

如果您向我们展示您尝试优化的查询以及execution plan,这将非常有帮助。 .

关于sql - 我应该添加主键列作为 Oracle RDBMS 中索引的最后一列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25188777/

相关文章:

database - CAP定理或简单英语的布鲁尔定理?

database - 比 self 联接配置单元查询更有效的方法

vb.net - Oracle.Connection 的替代品是什么?

java - 使用 java 和 oracle 搜索国家/多语言字符

sql - ORDER BY 优先指定特定值

sql - 在 Grails 中执行查询

mysql - 数据库建模: Product with 1 or more categories

sql - 将时间戳/日期时间从 UTC 转换为 EST Oracle SQL

sql - 列中具有相同值的行,将另一列中的所有值相加并显示 1 行

mysql - SQL Server 查询到 MySQL 查询的转换