关于oracle索引的简单问题

时间:2010-06-03 05:18:53

标签: oracle indexing

如果我有如下的oracle查询:

SELECT * FROM table_a where A = "1", B = "2", C = "3"

此查询拾取table_a的一个索引...索引是否需要在所有这三列上?

我要问的是:

  1. 如果索引在A,B,C,D?

  2. 上怎么办?
  3. 如果索引在B,C上怎么办?

  4. 只有当时才会选择索引 它在A,B,C上?

1 个答案:

答案 0 :(得分:5)

Oracle Cost Based Optimizer(CBO)尝试选择最便宜的表访问路径。单个表的访问路径包括索引范围扫描,索引完全扫描和表全扫描; CBO将估算每个计划的成本,并选择成本最低的计划。

<强> 1。如果索引在A,B,C,D?

上怎么办?

是的,Oracle可能会使用此索引 - 并且成本可能非常低,因为索引中的前导列(其中3个)在查询中受到限制。

<强> 2。如果索引在B,C上怎么办?

是的,Oracle可能会使用此索引 - 并且成本可能非常低,因为索引的所有列都在您的查询中受到限制。

第3。只有当它在A,B,C上时才能选择索引吗?

不,它不是排他性的。是的,Oracle可能会使用此索引 - 并且成本可能非常低,因为索引的所有列都在查询中受到限制。

需要考虑的其他因素:

  • 您的查询从表中选择*(所有列)。如果表只有四列(A,B,C,D),那么CBO可能更喜欢完全从(A,B,C,D)索引满足查询的计划而根本不访问该表。 / LI>
  • 你没有问更有趣的问题:“如果索引在D,C,B,A上怎么办?” - 答案是肯定的,Oracle可能会使用索引(例如,使用索引全扫描或索引跳过扫描)。只是以为我会把它丢在那里:)