我有一个我很好奇的索引(从很久以前开始)。它在一个基本的人表上,功能是
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)
有什么想法吗?感谢您及时回复。
列可以为空吗?查询是 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 行将匹配,并且对于每行都需要一个不在索引中的列,那么使用索引+表查找会比直接表扫描慢。
可能是表很小,不值得使用索引。