【问题标题】:will index be used when UPPER() the variable first?当 UPPER() 变量首先使用时会使用索引吗?
【发布时间】:2017-06-09 11:51:51
【问题描述】:

可能在 Oracle 数据库中遇到了全表扫描。我无法执行数据库中的explain 命令,简单来说,我没有权限。 我正在尝试弄清楚以下问题。

如果我在table 中有一个关于NAME 的索引

使用此查询:

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 索引将不会被使用。但是upper()是一个特殊的函数,所以之前看到的材料我也不是很确定。

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

如果我使用create index INDEX_NAME on table(upper(NAME));创建索引

请问:

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

使用索引 INDEX_NAME?

或者在上面的问题中会使用索引,而查询效率不高,因此需要很长时间才能执行?

【问题讨论】:

  • 1.看不到查询计划怎么知道是全扫描? 2. 全面扫描并不总是坏事! (例如,如果您的桌子不大)
  • 如果有意义,那么是的,Oracle 将使用name 上的索引
  • 您所说的关于许可的内容毫无意义。你是开发者吗?如果不是,为什么要关心索引和 FTS?所以我假设你是一个开发者。如果是这样,什么样的白痴(对不起,措辞苛刻)会雇用你成为一名开发人员,然后通过不允许你运行解释计划来阻止你正确地完成你的工作?去找你的经理,看看他们是否会改变这一点。
  • @LordPeter 有人指出这是全表扫描,而且表很大,选择可能需要 7-9 秒才能完成。
  • 你假设错了。您可以安装免费的 Oracle Express Edition (XE) 并将其用于您想要的任何东西。您还可以免费安装和使用非免费版本(我使用的是企业版,EE),只要它仅用于评估或学习目的。我不在该领域工作,我免费使用 EE(具有所有 Oracle 功能,以及 XE 中不可用的 12.1 版),因为我只是在学习它,而不是将它用于其他任何事情。对于所有其他用途,您始终可以免费使用 XE。

标签: oracle indexing


【解决方案1】:

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

如果您将name 包裹在upper() 中,则会阻止使用索引。右边发生的事情 - 无论你有 v1upper(v1) 还是更复杂的表达式 - 都无关紧要只要 name 也不会出现在右边那个复杂的表达式中

【讨论】:

  • 根据this,如果我在 UPPER(NAME) 上创建索引,并从 name = UPPER(NAME) 的表中选择某些内容,则将使用 UPPER(NAME) 索引。
  • 客户说它使用自制工具触发了全表扫描。
  • 我正在使用完整的 sql statemet 触发的全表扫描来更新问题。
  • @EvanL00: 但您的问题查询中没有upper(name)
  • @a_horse_with_no_name,是的,所以我试图弄清楚的是没有 UPPER() 会被索引。PS:感谢您的出色编辑。
【解决方案2】:

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

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

这是一个描述函数索引的link

【讨论】:

  • 感谢您的帮助。
  • 为什么 FBI 对 OP 的场景很有用,其中只有变量被转换,而不是列值?
  • @AlexPoole 我在想,因为 oracle 区分大小写,要将 UPPER(Variable) 与列进行比较,那么该列应该被索引为 Upper。
  • 这可能是对查询的合法更改,然后 FBI 可能会有所帮助;但不确定它是否在此处的范围内 - OP 目前似乎不需要这样做,而且我们不知道表中的所有值是否已经是大写。 FBI 不会帮助原始查询。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2015-02-25
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多