【发布时间】:2014-10-01 01:32:51
【问题描述】:
我正在针对某些带有索引的查询优化我的 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) 创建索引来明确指定这一点?这样做的主要好处是更容易对结果进行连接和子过滤。 IE。
WHEN a = 10 AND id > 3
由于这看起来很明显,而且我不记得有任何书推荐过,直觉告诉我 RDBMS 已经默认为所有索引执行此操作,但我想确定一下。对此主题有更多了解的人可以发表评论吗?
更新。链接的问题根本不涉及连接,也没有回答给出的问题。下面的 Markus Winand 评论回答了这个问题。答案是——如果你要去 WHERE 确实有意义(例如,如果你在没有 ROWNUM 的情况下进行分页,如此处所述 link),但除非它们非常具体 sort-merge joins,否则不会有利于连接,这是有道理的仅适用于非常大的表,并且需要进行一些额外的调整才能成为可能。
【问题讨论】:
-
“因为理想情况下我们想要有序的 ID”——我们为什么要这样?通常,您的索引应该或多或少与您的查询搜索条件相对应。如果您有一个显示为
WHERE A=? AND ID=?的查询(虽然我不明白您为什么会有这样的查询),那么您的索引应该包含这两列。 -
“我们为什么要这样?”对于我们的表也被 WHERE 过滤的连接。据我了解,如果我们通过 ID 将我们的表连接到其他表并过滤 WHERE A=10,则加入有序 ID 集 (1,3,5) 然后加入无序 ID (3,5, 1).
-
这和链接的问题绝对不一样。
标签: sql database oracle indexing rdbms