【问题标题】:Should I add primary key column as the last column of indexes in Oracle RDBMS?我应该将主键列添加为 Oracle RDBMS 中索引的最后一列吗?
【发布时间】: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


【解决方案1】:

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

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

但是,for 连接有点复杂。看看这些:

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

【讨论】:

  • 谢谢你,马库斯。我也很喜欢这个网站。给定文章中的 AFAIU - 将 PK 添加为索引的最后一列以加速连接是不切实际的,因为大多数连接将是散列连接,而将 PK 作为最后一列的索引只会有利于排序合并连接。只有当连接表上的连接谓词有两个精确索引时,排序合并连接才可能实现(并且它们在执行查询的连接部分时都可用和使用)。结论 - 这仅在您对两个非常大的表进行连接时才有意义(并且可能需要优化器提示)。
猜你喜欢
  • 2013-03-20
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2010-12-17
  • 2017-04-03
  • 2011-12-22
相关资源
最近更新 更多