我 可能 在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?
或者索引将在上面的问题中使用,查询效率不高所以需要花费很多时间才能执行?
答案 0 :(得分:2)
如果您在name
上有索引,那么优化器可以使用您给出的示例中的索引。它可以选择不使用它(例如,如果它估计将返回相对大部分的行);但是如果说只返回0.1%的行,那么无论如何都会使用索引。 (如果仍未发生这种情况,请确保统计信息是最新的。)
如果您将name
包裹在upper()
内,将会阻止使用索引的内容。在右侧发生的事情 - 无论您有v1
还是upper(v1)
还是更复杂的表达 - 只要 name
>也不会出现在右侧的复杂表达中。
答案 1 :(得分:0)
也许这会有所帮助......
在Oracle中,您可以在函数(函数索引)上创建索引,因此如果您在函数UPPER(NAME)而不仅仅是NAME上创建索引,Oracle可能更有可能使用索引(尽管它仍然可以选择不依赖其他因素。)
这是描述功能索引的link