当UPPER()变量首先使用时会使用索引吗?

时间:2017-06-09 11:51:51

标签: oracle indexing

可能 在Oracle数据库中遇到了全表扫描。我无法在数据库中执行explain命令,只是说,我没有获得许可。 我试图找出以下问题。

如果我在NAME

中的table上有索引

使用此查询:

select OID 
from table 
where NAME=UPPER(v1) 
  and TYPE=v2 
  and PID=v3 
  and OID<>v4 
  and PID =v5`

(v1是变量)

oracle是否会使用name上的索引来选择OID

我已经阅读了一些材料,并且说明了NAME索引不会被使用的条件的函数。但是鞋帮()是一个特殊的功能,所以我对我之前看过的材料不太确定。

这是@mathguy回答后的第二个问题:

如果我使用create index INDEX_NAME on table(upper(NAME));

创建索引

将是查询:

select OID,PID 
from table 
where PID=v1 
  and NAME=UPPER(v2)

使用索引INDEX_NAME?

或者索引将在上面的问题中使用,查询效率不高所以需要花费很多时间才能执行?

2 个答案:

答案 0 :(得分:2)

如果您在name上有索引,那么优化器可以使用您给出的示例中的索引。它可以选择不使用它(例如,如果它估计将返回相对大部分的行);但是如果说只返回0.1%的行,那么无论如何都会使用索引。 (如果仍未发生这种情况,请确保统计信息是最新的。)

如果您将name包裹在upper()内,将会阻止使用索引的内容。在右侧发生的事情 - 无论您有v1还是upper(v1)还是更复杂的表达 - 只要 name >也不会出现在右侧的复杂表达中。

答案 1 :(得分:0)

也许这会有所帮助......

在Oracle中,您可以在函数(函数索引)上创建索引,因此如果您在函数UPPER(NAME)而不仅仅是NAME上创建索引,Oracle可能更有可能使用索引(尽管它仍然可以选择不依赖其他因素。)

这是描述功能索引的link