在Oracle中,如果我对2列创建复合索引,那么在什么情况下会使用该索引来搜索记录?
a) 如果我的查询有一个涉及第一列的 WHERE 子句 例如WHEREfirst_column = '约翰'
b) 如果我的查询有一个涉及第二列的 WHERE 子句 例如WHERE secondary_column = '夏尔马'
c) a 或 b
d) a 和 b
e) 不是特别是这两列,而是可以是 WHERE 子句中的任何列。
f) 仅 a 列或 a 和 b 两列
最佳答案
我碰巧认为 MySQL 在描述如何使用复合索引方面做得非常好。文档是here .
基本思想是索引通常在以下情况下使用:
- 当
where
条件是col1
上的相等(col1 = value
)。 - 当
where
条件是不等式或in
上col1
(col1 in (list)
,col1 < value
) - 当
where
条件是col1
上的相等和col2
,通过and
连接(col1 = val1 and col2 = val2
) - 当
where
条件是col1
上的相等和一个不等式或in
上col2
. - 上述四种情况中的任何一种,其中附加列与其他列上的附加条件一起使用,并通过
and
连接.
此外,如果col1
,通常会使用索引和col2
是查询中唯一引用的列。这称为覆盖索引,并且——假设表中还有其他列——读取索引比原始表更快,因为索引较小。
Oracle 有一个非常智能的优化器,因此它也可能在某些相关情况下使用索引,例如当 col1
时使用in
条件以及 col2
上的条件.
一般来说,如果列是函数的参数,则条件不符合索引的条件。因此,这些子句不会使用基本索引:
where month(col1) = 3
where trunc(col1) = trunc(sysdate)
where abs(col1) < 1
Oracle 支持功能索引,因此如果这些结构确实很重要,您可以在 month(col1)
上创建索引, trunc(col1)
,或abs(col1)
.
此外,or
往往会降低使用索引的可能性。
关于sql - 在Oracle中,如果我对2列创建复合索引,那么在什么情况下会使用该索引来搜索记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28136561/