如果我有如下的oracle查询:
SELECT * FROM table_a where A = "1", B = "2", C = "3"
此查询拾取table_a的一个索引...索引是否需要在所有这三列上?
我要问的是:
如果索引在A,B,C,D?
如果索引在B,C上怎么办?
只有当时才会选择索引 它在A,B,C上?
答案 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>