我正在针对某些带索引的查询优化我的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
我应该通过为(A
,ID
)创建索引来明确指定吗?这样做的主要好处是可以更轻松地对结果进行连接和子过滤。 I.E.
WHEN a = 10 AND id > 3
由于这看起来非常明显,而且我不记得任何推荐这本书的书,直觉告诉我RDBMS默认已经为所有索引做了这个,但我想知道。有关此主题的更多知识的人可以发表评论吗?
更新。链接的问题根本不涉及联接,也不回答给出的问题。下面Markus Winand评论回答了这个问题。答案是 - 如果您要使用WHERE(例如,如果您在没有ROWNUM的情况下进行分页,如此处所述link),它确实有意义,但除非它们非常具体,否则不会使连接受益sort-merge joins ,这只适用于非常大的表格,需要进行一些额外的调整。
答案 0 :(得分:2)
索引order by
条款确实是可能的,有时是防止排序的好方法:
http://use-the-index-luke.com/sql/sorting-grouping/indexed-order-by
然而,对于连接来说有点复杂。看看这些:
如果您向我们展示您尝试优化的查询以及execution plan,那将非常有用。