关于oracle索引的简单问题

joh*_*ohn 0 oracle indexing

如果我有如下的oracle查询:

SELECT * FROM table_a where A = "1", B = "2", C = "3"
Run Code Online (Sandbox Code Playgroud)

此查询皮卡表-A的指标之一...没有索引必须对这些列的所有3?

我要问的是:

  1. 如果索引在A,B,C,D上怎么办?

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

  3. 索引只能在A,B,C上被选中吗?

Jef*_*emp 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)上的索引满足查询的计划而根本不访问该表.
  • 你没有问更有趣的问题:" 如果索引在D,C,B,A上怎么办? " - 答案是肯定的,Oracle可能会使用索引(例如使用索引全扫描或者索引跳过扫描).只是以为我会扔在那里:)