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

时间:2014-08-07 17:38:09

标签: 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创建了索引,因此我希望ID对于该索引中的A的每个值都是无序的。这应该是效率低下的,因为我们理想地想要订购ID之类的

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

我应该通过为(AID)创建索引来明确指定吗?这样做的主要好处是可以更轻松地对结果进行连接和子过滤。 I.E.

WHEN a = 10 AND id > 3

由于这看起来非常明显,而且我不记得任何推荐这本书的书,直觉告诉我RDBMS默认已经为所有索引做了这个,但我想知道。有关此主题的更多知识的人可以发表评论吗?

更新。链接的问题根本不涉及联接,也不回答给出的问题。下面Markus Winand评论回答了这个问题。答案是 - 如果您要使用WHERE(例如,如果您在没有ROWNUM的情况下进行分页,如此处所述link),它确实有意义,但除非它们非常具体,否则不会使连接受益sort-merge joins ,这只适用于非常大的表格,需要进行一些额外的调整。

1 个答案:

答案 0 :(得分:2)

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

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

然而,对于连接来说有点复杂。看看这些:

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