FBI on 连接字符串的函数

And*_*ndy 0 index oracle

我有一个我很好奇的索引(从很久以前开始)。它在一个基本的人表上,功能是

upper("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME")
Run Code Online (Sandbox Code Playgroud)

在尝试搜索此索引时,我最终进行了全表扫描。知道为什么吗?如果这就像我想的那样完全被破坏了,你会建议在这四列上建立一个列索引吗?

编辑

很抱歉没有提供查询。是的,查询很像,并且列都可以为空。所以我有

select *
  from person p
  where UPPER("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME")
    like replace(upper('<search string here>'), '*', '%') || '%'
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?感谢您及时回复。

Gar*_*ary 5

列可以为空吗?查询是 LIKE 吗?是否存在 NLS 问题?

我期待一个

upper("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME") = :bind
Run Code Online (Sandbox Code Playgroud)

使用索引范围扫描

upper("LAST_NAME"||','||"FIRST_NAME"||"MIDDLE_NAME"||"SUFFIX_NAME") LIKE :bind
Run Code Online (Sandbox Code Playgroud)

根据是否可能需要表中的列,可以使用索引快速全扫描或表扫描。如果它认为 5 行中有 1 行将匹配,并且对于每行都需要一个不在索引中的列,那么使用索引+表查找会比直接表扫描慢。

可能是表很小,不值得使用索引。