我正在针对某些带有索引的查询优化 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 连接稍微复杂一些。看看这些:
- http://use-the-index-luke.com/sql/join/nested-loops-join-n1-problem
- http://use-the-index-luke.com/sql/join/hash-join-partial-objects
- http://use-the-index-luke.com/sql/join/sort-merge-join (现在几乎不使用)。
如果您向我们展示您尝试优化的查询以及execution plan,这将非常有帮助。 .
关于sql - 我应该添加主键列作为 Oracle RDBMS 中索引的最后一列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25188777/