Oracle UPPER()首先输入变量时是否使用索引?

Oracle UPPER()首先输入变量时是否使用索引?,oracle,indexing,Oracle,Indexing,我可能遇到Oracle数据库中的完整表扫描。我不能在数据库中执行explain命令,简单地说,我没有权限。 我想弄清楚下面的问题 如果我在表中的名称上有索引 使用此查询: select OID from table where NAME=UPPER(v1) and TYPE=v2 and PID=v3 and OID<>v4 and PID =v5` 使用索引名称 或者将在上述问题中使用索引,而查询效率不高,因此需要花费大量时间执行?如果您在name上有

我可能遇到Oracle数据库中的完整表扫描。我不能在数据库中执行
explain
命令,简单地说,我没有权限。 我想弄清楚下面的问题

如果我在
表中的
名称
上有索引

使用此查询:

select OID 
from table 
where NAME=UPPER(v1) 
  and TYPE=v2 
  and PID=v3 
  and OID<>v4 
  and PID =v5`
使用索引名称


或者将在上述问题中使用索引,而查询效率不高,因此需要花费大量时间执行?

如果您在
name
上有索引,则优化器可能会在您给出的示例中使用索引。它可以选择不使用它(例如,如果它估计无论如何都会返回相当大一部分行);但是如果只返回0.1%的行,那么无论如何都会使用索引。(如果这仍然没有发生,请确保统计数据是最新的。)


如果将
name
包装在
upper()
中,将阻止使用索引。在右手边发生的事情——无论是
v1
还是
v1
或者更复杂的表达式——都是不相关的,只要
名称
也不出现在右手边的复杂表达式中。

也许这会有帮助

在Oracle中,您可以在函数(函数索引)上创建索引,因此,如果您在函数上方(名称)而不是仅在名称上创建索引,Oracle可能更倾向于使用该索引(尽管Oracle可能会根据其他因素选择不使用)


下面是一个描述函数索引的示例

1。如果看不到查询计划,您如何知道它是完全扫描?2.完整扫描并不总是坏的!(例如,如果您的表不大)如果有意义,则“是”,Oracle将在
name
上使用索引,您所说的权限没有意义。你是开发人员吗?如果你不是,为什么你关心指数和富时指数?所以我假设你是一个开发者。如果是这样的话,什么样的白痴(很抱歉说了这么严厉的话)会雇佣你做一名开发人员,但不允许你运行解释计划,从而妨碍你正确地完成工作?去找你的经理,看看他们是否会改变这一点。@LordPeter有人指出,这是一次完整的表格扫描,表格非常大,选择可能需要7-9秒才能完成。你想错了。您可以安装Oracle的免费快速版(XE),并将其用于任何您想要的用途。您还可以免费安装和使用非免费版本(我使用的是Enterprise Edition,EE),只要它仅用于评估或学习目的。我不在这一领域工作,我免费使用EE(具有所有Oracle功能,以及XE中没有的12.1版),因为我只是在学习,没有将其用于任何其他用途。对于所有其他用途,您始终可以免费使用XE。根据,如果我在UPPER(名称)上创建索引,并从NAME=UPPER(名称)的表中选择某个内容,则UPPER(名称)将使用索引。客户说它使用其homegrow工具触发了一个完整的表扫描。我正在用完整的sql statemet触发的完整表扫描更新问题。@EvanL00:但您的问题查询中没有
upper(name)
。@a_horse_没有名称,是的,所以我想弄清楚的是没有upper()索引将被命中。。PS:谢谢你的精彩编辑。谢谢你的帮助。为什么FBI会对OP的场景有用,在OP的场景中,只有变量被转换,而不是列值?@AlexPoole我在想,因为oracle是区分大小写的,所以要将上限(变量)与列进行比较,然后该列应该被索引为Upper。这可能是对查询的合法更改,然后FBI可能会有所帮助;但不确定它是否在这里的范围内-OP目前似乎不需要这样做,而且我们不知道表中的所有值是否都已经是大写。FBI不会帮助最初的调查。
select OID,PID 
from table 
where PID=v1 
  and NAME=UPPER(v2)